标签:des style class blog code java
Description
Input
Output
Sample Input
Sample Output
1 #include"stdio.h" 2 #include"string.h" 3 #define lson l, m, rt<<1 4 #define rson m+1, r, rt<<1|1 5 const int maxn=55555; 6 int sum[maxn<<2];//4倍绝对没有一点问题 7 void PushUP(int rt) 8 { 9 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 10 }//回溯更新父节点 11 void build(int l,int r,int rt) 12 { 13 if(l==r) {scanf("%d",&sum[rt]); return;} 14 int m=(l+r)>>1; 15 build(lson); 16 build(rson); 17 PushUP(rt); 18 }//建立从l到r的线段树 19 void updata(int p,int add,int l,int r,int rt) 20 { 21 if(l==r){sum[rt]+=add; return;} 22 int m=(l+r)>>1; 23 if(p<=m) updata(p,add,lson); 24 else updata(p,add,rson); 25 PushUP(rt); 26 }//查找到需要更新的一点,将其值改变,然后依次回溯更新父节点 27 int query(int L,int R,int l,int r,int rt) 28 { 29 if(L<=l&&r<=R) {return sum[rt];} 30 int m=(l+r)>>1; 31 int ret=0; 32 if(L<=m) ret+=query(L,R,lson); 33 if(R>m) ret+=query(L,R,rson); 34 return ret; 35 }/*如果恰好题中要求解的区间在左儿子或者右儿子中,那么直接返回其所在的节点的值,否则把左儿子和右儿子中的区间加起来返回*/ 36 int main() 37 { 38 int T,n,k=0; 39 scanf("%d",&T); 40 while(T--) 41 { 42 scanf("%d",&n); 43 printf("Case %d:\n",++k); 44 build(1,n,1);//建树 45 char str[20]; 46 scanf("%s",str); 47 while(strcmp(str,"End")!=0) 48 { 49 int x,y; 50 scanf("%d%d",&x,&y); 51 if(strcmp(str,"Query")==0) 52 printf("%d\n",query(x,y,1,n,1)); 53 else if(strcmp(str,"Add")==0) 54 updata(x,y,1,n,1); 55 else if(strcmp(str,"Sub")==0) 56 updata(x,-y,1,n,1); 57 scanf("%s",str); 58 } 59 } 60 return 0; 61 }
标签:des style class blog code java
原文地址:http://www.cnblogs.com/767355675hutaishi/p/3706016.html