标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 60916 Accepted Submission(s): 25799
1 #include<stdio.h> 2 #include<string.h> 3 using namespace std; 4 const int MAXN=50010; 5 int tree[MAXN<<3]; 6 int L,R,X,Y,ans;//L,R代表查询的区间,X代表更新的点 ,Y代表增加或减少的点; 7 void build(int root,int l,int r){ 8 if(l==r)scanf("%d",&tree[root]); 9 else{ 10 int mid=(l+r)>>1; 11 build(root<<1,l,mid); 12 build(root<<1|1,mid+1,r); 13 tree[root]=tree[root<<1]+tree[root<<1|1]; 14 } 15 } 16 void update(int root,int l,int r){ 17 if(l==X&&r==X)tree[root]+=Y; 18 else{ 19 int mid=(l+r)>>1; 20 if(X<=mid) 21 update(root<<1,l,mid); 22 else 23 update(root<<1|1,mid+1,r); 24 tree[root]=tree[root<<1]+tree[root<<1|1]; 25 } 26 } 27 int query(int root,int l,int r){ 28 29 if(L<=l&&R>=r)ans+=tree[root]; 30 else{ 31 int mid=(l+r)>>1; 32 if(L<=mid)query(root<<1,l,mid); 33 if(R>mid)query(root<<1|1,mid+1,r); 34 } 35 //ans=0;每次让ans=0ans+=上次返回的值;这种方法很是巧妙。。。 36 /* 37 if(L<=l&&R>=r)return tree[root]; 38 else{ 39 int mid=(l+r)>>1; 40 ans=0; 41 if(L<=mid)ans+=query(root<<1,l,mid); 42 if(R>mid)ans+=query(root<<1|1,mid+1,r); 43 return ans; 44 }*/ 45 } 46 int main(){ 47 int T,N,flot=0; 48 char temp[10]; 49 scanf("%d",&T); 50 while(T--){ 51 printf("Case %d:\n",++flot); 52 scanf("%d",&N); 53 build(1,1,N); 54 //for(int i=1;i<=100;i++)printf("tree[%d]=%d\n",i,tree[i]); 55 while(scanf("%s",temp),strcmp(temp,"End")){ 56 ans=0; 57 if(!strcmp(temp,"Add")){ 58 scanf("%d%d",&X,&Y); 59 update(1,1,N); 60 } 61 else if(!strcmp(temp,"Sub")){ 62 scanf("%d%d",&X,&Y); 63 Y=-Y;update(1,1,N); 64 } 65 else{ 66 scanf("%d%d",&L,&R); 67 // printf("%d\n",query(1,1,N)); 68 query(1,1,N); 69 printf("%d\n",ans); 70 } 71 } 72 } 73 return 0; 74 }
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/4793322.html