标签:
(中文题意)
线段树水题。我写的第一个线段树。
re是因为数组开小了。线段树的数组下次开3*n,而不是2*n。
#include<iostream> #include<stdio.h> using namespace std; int n,tar,val,ans; bool ok; struct tr { int l,r,num; }; int tmp[50005]; tr me[100010+50005]; void build(int s,int e,int k) { int m; me[k].l=s; me[k].r=e; if(s==e) { me[k].num=tmp[s]; return; } m=(s+e)>>1; build(s,m,k<<1); build(m+1,e,k<<1|1); me[k].num=me[k<<1].num+me[k<<1|1].num; } void solve(int k) { int m; if(ok) { me[k].num+=val; } else { me[k].num-=val; } if(me[k].r==me[k].l) return; m=(me[k].r+me[k].l)>>1; if(tar>m) { solve(k<<1|1); } else { solve(k<<1); } } void add() { scanf("%d%d",&tar,&val); ok=1; solve(1); } void sub() { scanf("%d%d",&tar,&val); ok=0; solve(1); } void que(int k,int x,int y) { int m; if(me[k].l==x&&me[k].r==y) { ans+=me[k].num; return; } m=(me[k].l+me[k].r)>>1; if(x<=m&&y>m) { que(k<<1,x,m); que(k<<1|1,m+1,y); } else if(y<=m) { que(k<<1,x,y); } else if(x>m) { que(k<<1|1,x,y); } } int main() { int t,i,j,k,m,x,y,z; char typ[15]; while(scanf("%d",&t)!=EOF) { getchar(); for(i=1;i<=t;i++) { printf("Case %d:\n",i); scanf("%d",&n); getchar(); for(j=1;j<=n;j++) { scanf("%d",&tmp[j]); } getchar(); build(1,n,1); scanf("%s",typ); while(typ[0]!=‘E‘) { switch(typ[0]) { case ‘A‘: add();break; case ‘S‘: sub();break; case ‘Q‘: scanf("%d%d",&x,&y); ans=0; que(1,x,y); printf("%d\n",ans);break; } getchar(); scanf("%s",&typ); } } } return 0; }
标签:
原文地址:http://www.cnblogs.com/tun117/p/4523979.html