题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1166
解题思路
友情提示,直接看输入描述就行,无需读题。
还是板子题,若不会可以参考本专栏第一篇题解中的链接。
AC代码
#include<string> #include<cstdio> #include<iostream> #define ll long long using namespace std; const int N=5e4+10; int aa[N],cas,a,b,T,n; struct TREE { int l,r,sum; }tree[N<<2]; string op; void Build(int i,int l,int r) { tree[i].l=l; tree[i].r=r; tree[i].sum=0; if(l==r) { tree[i].sum=aa[l]; return ; } int mid=(l+r)>>1; Build(i<<1,l,mid); Build(i<<1|1,mid+1,r); tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum; return ; } void Add(int i,int x,int add) { if(tree[i].l==tree[i].r) { tree[i].sum+=add; return ; } int mid=(tree[i].l+tree[i].r)>>1; if(x<=mid) Add(i<<1,x,add);//left subtree else Add(i<<1|1,x,add); tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum; return ; } void Sub(int i,int x,int sub) { if(tree[i].l==tree[i].r) { tree[i].sum-=sub; return ; } int mid=(tree[i].l+tree[i].r)>>1; if(x<=mid) Sub(i<<1,x,sub);//left else Sub(i<<1|1,x,sub); tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum; return ; } int Query(int i,int l,int r) { if(l<=tree[i].l && tree[i].r<=r) return tree[i].sum; if(tree[i].l>r || tree[i].r<l) return 0; int res=0; if(l<=tree[i<<1].r) res+=Query(i<<1,l,r);//left if(r>=tree[i<<1|1].l) res+=Query(i<<1|1,l,r); return res; } int main() { scanf("%d",&T); while(T--) { cas++; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&aa[i]); Build(1,1,n); printf("Case %d:\n",cas); while(1) { cin>>op; if(op=="End") break; scanf("%d%d",&a,&b); if(op=="Add") Add(1,a,b); else if(op=="Sub") Sub(1,a,b); else printf("%d\n",Query(1,a,b)); } } return 0; }