码迷,mamicode.com
首页 > 其他好文 > 详细

[Hdu6315]Naive Operations

时间:2018-10-02 22:29:52      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:ace   name   str   nbsp   names   namespace   color   oid   数组   

题意:给定一个初始数组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\n",query(1,1,n,l,r));
88         }
89     }
90     return 0;
91 }

 

[Hdu6315]Naive Operations

标签:ace   name   str   nbsp   names   namespace   color   oid   数组   

原文地址:https://www.cnblogs.com/Slrslr/p/9737714.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!