HDU 1166 敌兵布阵

来源:互联网 发布:react.js 中文文档 编辑:程序博客网 时间:2024/06/06 04:13

题意:

原意是有n个阵地,每次可以向某个阵地加、减人,还能问你l~r阵地的士兵总人数。

思路:

线段树,单点更新,区间求和。

#include<cstdio>#include<cstring>const int MAX=50005;int sum[MAX<<2];void PushUp(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void Build(int l,int r,int rt){sum[rt]=0;if(l==r){scanf("%d",&sum[rt]);return;}int mid=(l+r)>>1;Build(l,mid,rt<<1);Build(mid+1,r,rt<<1|1);PushUp(rt);}void UpDate(int pos,int c,int l,int r,int rt){if(l==r){sum[rt]+=c;return;}int mid=(l+r)>>1;if(pos<=mid) UpDate(pos,c,l,mid,rt<<1);else UpDate(pos,c,mid+1,r,rt<<1|1);PushUp(rt);}int Query(int L,int R,int l,int r,int rt){if(L<=l&&r<=R){return sum[rt];}int res=0;int mid=(l+r)>>1;if(L<=mid) res+=Query(L,R,l,mid,rt<<1);if(mid<R) res+=Query(L,R,mid+1,r,rt<<1|1);return res;}int main(){int T,cas=1;scanf("%d",&T);while(T--){int n;scanf("%d",&n);Build(1,n,1);char op[10];int i,j;printf("Case %d:\n",cas++);while(~scanf("%s",op)&&op[0]!='E'){scanf("%d%d",&i,&j);if(op[0]=='A') UpDate(i,j,1,n,1);if(op[0]=='S') UpDate(i,-j,1,n,1);if(op[0]=='Q') printf("%d\n",Query(i,j,1,n,1));}}return 0;}


0 0