@lawk97
2017-05-27T02:51:46.000000Z
字数 2598
阅读 1041
线段树
[HDU - 1166]
#include <cstdio>#include <iostream>#include <algorithm>#include <cmath>#include <cstring>#include <map>using namespace std;int test;int n,kase;char order[10];struct tr{int l,r,v;}t[200005];void build(int k,int l,int r){t[k].l=l;t[k].r=r;t[k].v=0;if (l==r){return;}int mid=l+(r-l)/2;build(k*2,l,mid);build(k*2+1,mid+1,r);}void add(int k,int now,int num){if (t[k].l==t[k].r){t[k].v+=num;return;}int mid=t[k].l+(t[k].r-t[k].l)/2;if (now<=mid){add(2*k,now,num);}else{add(2*k+1,now,num);}t[k].v=t[k*2].v+t[k*2+1].v;}int query(int k,int a,int b){if (t[k].l>=a&&t[k].r<=b){return t[k].v;}if (a>t[k].r||b<t[k].l){return 0;}int mid=t[k].l+(t[k].r-t[k].l)/2;if (a>mid){return query(2*k+1,a,b);}else if(b<=mid){return query(2*k,a,b);}else{return query(2*k,a,mid)+query(2*k+1,mid+1,b);}}int main(){kase=0;scanf("%d",&test);while(test--){scanf("%d",&n);build(1,1,n);printf("Case %d:\n",++kase );for(int i=1;i<=n;i++){int num;scanf("%d",&num);add(1,i,num);}while(scanf("%s",order),order[0]!='E'){int a,b;scanf("%d%d",&a,&b);if(order[0]=='A'){add(1,a,b);}else if(order[0]=='S'){add(1,a,-b);}else{printf("%d\n",query(1,a,b));}}}}
[HDU - 1556]
#include <cstdio>#include <iostream>#include <algorithm>#include <cmath>#include <cstring>#include <map>using namespace std;int n;struct tr{int l,r,v,lazy;}t[400005];void build(int k,int l,int r){t[k].l=l;t[k].r=r;t[k].v=0;t[k].lazy=0;if (l==r){return;}int mid=l+(r-l)/2;build(k*2,l,mid);build(k*2+1,mid+1,r);}void add(int k,int now,int num){if (t[k].l==t[k].r){t[k].v+=num;return;}int mid=t[k].l+(t[k].r-t[k].l)/2;if (now<=mid){add(2*k,now,num);}else{add(2*k+1,now,num);}//t[k].v=t[k*2].v+t[k*2+1].v;}void pushdown(int k){if(t[k].lazy>0){t[2*k].v+=t[k].lazy;t[2*k+1].v+=t[k].lazy;t[2*k].lazy+=t[k].lazy;t[2*k+1].lazy+=t[k].lazy;t[k].lazy=0;}}void update(int k,int l,int r){if(l<=t[k].l&&r>=t[k].r){t[k].v++;t[k].lazy++;return;}pushdown(k);int mid=t[k].l+(t[k].r-t[k].l)/2;if (l>mid){update(2*k+1,l,r);}else if(r<=mid){update(2*k,l,r);}else{update(2*k,l,mid);update(2*k+1,mid+1,r);}}int query(int k,int l,int r){if (t[k].l==t[k].r){return t[k].v;}pushdown(k);int mid=t[k].l+(t[k].r-t[k].l)/2;if (l>mid)//thisproblem,l==r{return query(2*k+1,l,r);}else{return query(2*k,l,r);}/*else{return query(2*k,l,mid)+query(2*k+1,mid+1,r);}*/}int main(){while(scanf("%d",&n),n!=0){build(1,1,n);for(int i=1;i<=n;i++){int l,r;scanf("%d%d",&l,&r);update(1,l,r);}for(int i=1;i<=n;i++){if (i>1){printf(" ");}printf("%d",query(1,i,i));}printf("\n");}}