Case 1:
6
33
59
分析:线段树入门题目。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int maxn=50010; struct Tree { int l; int r; int sum; }T[maxn<<2]; int c[maxn],ans,n; void build(int l,int r,int u) { T[u].l=l,T[u].r=r; if(l==r) { T[u].sum=c[l]; return; } int mid=(T[u].l+T[u].r)>>1; build(l,mid,u<<1); build(mid+1,r,u<<1|1); T[u].sum=T[u<<1].sum+T[u<<1|1].sum; } void update(int a,int b,int u,int ok) { if(T[u].l==T[u].r) { if(ok) T[u].sum+=b; else T[u].sum-=b; } else { int mid=(T[u].l+T[u].r)>>1; if(mid>=a) update(a,b,u<<1,ok); else update(a,b,u<<1|1,ok); T[u].sum=T[u<<1].sum+T[u<<1|1].sum; } } void query(int l,int r,int u) { if(T[u].l>=l&&T[u].r<=r) { ans+=T[u].sum; return; } int mid=(T[u].l+T[u].r)>>1; if(r<=mid) query(l,r,u<<1); else if(l>=mid+1) query(l,r,u<<1|1); else { query(l,mid,u<<1); query(mid+1,r,u<<1|1); } } int main() { char s[7]; int a,b,t; scanf("%d",&t); for(int ii=1;ii<=t;ii++) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&c[i]); build(1,n,1); printf("Case %d:\n",ii); while(scanf("%s",s)&&strcmp(s,"End")!=0) { scanf("%d%d",&a,&b); if(!strcmp(s,"Query")) { ans=0; query(a,b,1); cout<<ans<<endl; } else if(!strcmp(s,"Add")) { update(a,b,1,1); } else if(!strcmp(s,"Sub")) { update(a,b,1,0); } } } return 0; } 开始无数TLE,使用了cin的原因,建议大家以后多用scanf输入数据。。。