[Hdu6315]Naive Operations

Posted slrslr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Hdu6315]Naive Operations相关的知识,希望对你有一定的参考价值。

题意:给定一个初始数组b和一个初始值全部为0的数组a,每次操作可以在给定的区间(l,r)内让a[i](l=<i<=r)加一,或者查询区间区间(l,r)中a[i]/b[i](l=<i<=r)(取整)的和。
可以知道,$sum_{frac{a_i}{b_i}}le nlogn$,所以我们只要暴力找到需要修改的位置修改即可。。
代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define M 100010
 5 #define ls node<<1
 6 #define rs node<<1|1
 7 using namespace std;
 8 int n,q;
 9 int maxn[M<<2],minn[M<<2],cnt[M<<2],tag[M<<2],b[M];
10 
11 void update(int node) 
12 {
13     minn[node]=min(minn[ls],minn[rs]);
14     cnt[node]=cnt[ls]+cnt[rs];
15     maxn[node]=max(maxn[ls],maxn[rs]);
16 }
17 
18 void build(int node,int l,int r)
19 {
20     if(l==r) {minn[node]=b[l];return;}
21     int mid=(l+r)/2;
22     build(ls,l,mid);
23     build(rs,mid+1,r);
24     update(node);
25 }
26 
27 void push(int node)
28 {
29     if(tag[node])
30     {
31         maxn[ls]+=tag[node];
32         maxn[rs]+=tag[node];
33         tag[ls]+=tag[node];
34         tag[rs]+=tag[node];
35         tag[node]=0;
36     }
37 }
38 
39 void change(int node,int l,int r,int l1,int r1)
40 {
41     if(l1<=l&&r1>=r)
42     {
43         maxn[node]++;
44         if(maxn[node]<minn[node])
45         {
46             tag[node]++;
47             return;
48         }
49         if(l==r&&maxn[node]>=minn[node])
50         {
51             cnt[node]++;
52             minn[node]+=b[l];
53             return;
54         }
55     }
56     int mid=(l+r)/2;push(node);
57     if(l1<=mid) change(ls,l,mid,l1,r1);
58     if(r1>mid) change(rs,mid+1,r,l1,r1);
59     update(node);
60 }
61 
62 int query(int node,int l,int r,int l1,int r1)
63 {
64     if(l1<=l&&r1>=r) return cnt[node];
65     int mid=(l+r)/2; push(node);
66     int ans=0;
67     if(l1<=mid) ans+=query(ls,l,mid,l1,r1);
68     if(r1>mid) ans+=query(rs,mid+1,r,l1,r1);
69     return ans;
70 }
71 
72 int main()
73 {
74     while(~scanf("%d%d",&n,&q))
75     {
76         memset(maxn,0,sizeof(maxn));
77         memset(minn,0,sizeof(minn));
78         memset(cnt,0,sizeof(cnt));
79         memset(tag,0,sizeof(tag));
80         for(int i=1;i<=n;i++) scanf("%d",&b[i]);
81         build(1,1,n);
82         while(q--)
83         {
84             int l,r;char s[10];
85             scanf("%s%d%d",s,&l,&r);
86             if(s[0]==a) change(1,1,n,l,r);
87             else printf("%d
",query(1,1,n,l,r));
88         }
89     }
90     return 0;
91 }

 

以上是关于[Hdu6315]Naive Operations的主要内容,如果未能解决你的问题,请参考以下文章

HDU6315 Naive Operations(多校第二场1007)(线段树)

[HDU6315]Naive Operations(线段树+树状数组)

HDU-DuoXiao第二场hdu 6315 Naive Operations 线段树

HDU6315 Naive Operations(线段树 复杂度分析)

Naive Operations HDU6315 (杭电多校2G)

HDU - 6315(2018 Multi-University Training Contest 2) Naive Operations (线段树区间操作)