hdu 1166
Posted zquacm-875180305
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1166相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
线段树或者树状数组都可以做。
最近学线段树维护数据,所以我用线段树维护sum。
线段树实际上就是一个完全二叉树,用递归自顶向下进行访问。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 const int maxn=50006,maxm=40006; 6 int a[maxn],ans[maxm]; 7 struct{ 8 int lef,rig,sum; 9 } tree[maxn*4]; 10 int n, ANS; 11 12 void build(int x,int y,int now) 13 { 14 tree[now].lef=x; 15 tree[now].rig=y; 16 if(x==y){ 17 scanf("%d",&tree[now].sum); 18 return ; 19 } 20 int mid=(x+y)>>1; 21 build( x, mid, now<<1); 22 build( mid+1, y, now<<1|1); 23 tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum; 24 } 25 26 void add(int x,int y,int now,int goal,int add_num) 27 { 28 if(x==y){ 29 tree[now].sum+=add_num; 30 return ; 31 } 32 int mid=(x+y)>>1; 33 if(goal<=mid){ 34 add( x, mid, now<<1, goal, add_num); 35 } 36 else{ 37 add( mid+1, y, now<<1|1, goal, add_num); 38 } 39 tree[now].sum+=add_num; 40 } 41 42 void query(int x,int y,int now, int eachx,int eachy) 43 { 44 if(x>=eachx&&y<=eachy){ 45 ANS+=tree[now].sum; 46 return ; 47 } 48 int mid=(x+y)>>1; 49 if(mid>=eachy){ 50 query( x, mid, now<<1, eachx, eachy); 51 } 52 else if(mid<eachx){ 53 query( mid+1, y, now<<1|1, eachx, eachy); 54 } 55 else{ 56 query( x, mid, now<<1, eachx, eachy); 57 query( mid+1, y, now<<1|1, eachx, eachy); 58 } 59 } 60 61 int main() 62 { 63 int T,kkk=1; 64 scanf("%d",&T); 65 while(T--){ 66 char order[10]; 67 scanf("%d",&n); 68 int num=0; 69 build(1,n,1); 70 int x,y; 71 while( ~scanf("%s",order)){ 72 if(order[0]==‘E‘) break; 73 scanf("%d%d",&x,&y); 74 if(order[0]==‘A‘) add(1,n,1,x,y); 75 if(order[0]==‘S‘) add(1,n,1,x,-y); 76 if(order[0]==‘Q‘){ 77 ANS=0; 78 query( 1, n, 1, x, y); 79 ans[++num]=ANS; 80 } 81 } 82 printf("Case %d: ",kkk++); 83 for(int i=1;i<=num;i++){ 84 printf("%d ",ans[i]); 85 } 86 } 87 return 0; 88 }
最后因为一个等于号,调了一会。
以上是关于hdu 1166的主要内容,如果未能解决你的问题,请参考以下文章