hdu 1166 敌兵布阵 线段树 单点更新
2014-03-29 23:06
369 查看
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N =50005; int sum[N<<2]; int a ; void build(int l,int r,int rt){ if(l==r){ sum[rt]=a[l]; return; } int mid=(l+r)>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void update(int l,int r,int p,int x,int rt){ if(l==r){ sum[rt]+=x; return; } int mid=(l+r)>>1; if(p<=mid) update(l,mid,p,x,rt<<1); else update(mid+1,r,p,x,rt<<1|1); sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } int query(int l,int r,int L,int R,int rt){ if(l>=L&&r<=R){ return sum[rt]; } int mid=(l+r)>>1; /*if(R<=mid) return query(l,mid,L,R,rt<<1); else if(L>mid) return query(mid+1,r,L,R,rt<<1|1); else return query(l,mid,L,R,rt<<1)+query(mid+1,r,L,R,rt<<1|1); */ int ret=0; if(L<=mid) ret+=query(l,mid,L,R,rt<<1); if(R>mid) ret+=query(mid+1,r,L,R,rt<<1|1); return ret; } int main(){ int t,n; int f=1; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } build(1,n,1); printf("Case %d:\n",f++); char str[10]; int r,c; while(scanf("%s",str)!=EOF){ if(str[0]=='E') break; scanf("%d%d",&r,&c); if(str[0]=='A') update(1,n,r,c,1); else if(str[0]=='S') update(1,n,r,-c,1); else printf("%d\n",query(1,n,r,c,1)); } } return 0; }复习下线段树,学习了下大神的线段树写法。
相关文章推荐
- hdu 1166 敌兵布阵(线段树-单点更新,区间求和)
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- hdu 1166 敌兵布阵 单点更新 树状数组 线段树 两种做法
- HDU 1166 敌兵布阵【线段树-单点更新】
- hdu1166 敌兵布阵 线段树 单点更新
- HDU—1166—敌兵布阵—【数据结构】【线段树】【单点更新】
- hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)
- hdu 1166 敌兵布阵 线段树单点更新
- kuangbin专题七:A题 HDU 1166 敌兵布阵(单点更新,区域查询求和的线段树模板)
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- HDU 1166 敌兵布阵 (线段树单点更新+区间查询入门)
- HDU 1166 敌兵布阵(线段树单点更新区间求和)
- HDU-1166-敌兵布阵(线段树 单点更新)
- HDU 1166 敌兵布阵(线段树查询+单点更新)
- hdu1166敌兵布阵(线段树---单点更新,区间求值)
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- hdu 1166 敌兵布阵(线段树-单点更新)
- HDU 1166-敌兵布阵(线段树单点更新)
- hdu 1166 敌兵布阵(线段树单点更新,区间查询)
- HDU 1166 敌兵布阵(线段树单点更新,板子题)