[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 (线段树区间操作)