HDU 1166 敌兵布阵 线段树,单点更新
2012-08-10 21:53
357 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
代码
View Code
代码
View Code
#include <stdio.h> #include <string.h> #define maxn 50000*4+5 struct node { int l,r,val; }tr[maxn]; void pushup(int rt) { tr[rt].val = tr[rt*2].val+tr[rt*2+1].val; return; } void build(int l,int r,int rt) { tr[rt].l = l; tr[rt].r = r; if(r == l) { scanf("%d",&tr[rt].val); return; } int m; m = (r+l)/2; build(l,m,rt*2); build(m+1,r,rt*2+1); pushup(rt); } void update(int target,int val,int rt) { int m; if(tr[rt].l == tr[rt].r){ tr[rt].val += val; return; } m = (tr[rt].l+tr[rt].r)/2; if(target > m) update(target,val,rt*2+1); else update(target,val,rt*2); pushup(rt); return; } int ask(int l,int r,int rt) { if(tr[rt].l == l&& r == tr[rt].r) return tr[rt].val; int m; m = (tr[rt].l+tr[rt].r)/2; if(l > m) return ask(l,r,rt*2+1); else if(r <= m) return ask(l,r,rt*2); else return ask(l,m,rt*2)+ask(m+1,r,rt*2+1); } int main() { int t; scanf("%d",&t); int cas = 0; while(t--) { cas++; printf("Case %d:\n",cas); int n,i,j,k; char order[20]; scanf("%d",&n); build(1,n,1); while(~scanf("%s",order)) { if(order[0] == 'E') break; scanf("%d %d",&i,&j); if(order[0] == 'A') update(i,j,1); else if(order[0] == 'S') update(i,-j,1); else printf("%d\n",ask(i,j,1)); } } }
相关文章推荐
- Hdu 1166 敌兵布阵 树状数组 或 线段树 单点更新,区间求和
- hdu 1166 敌兵布阵(单点更新线段树)
- 敌兵布阵 HDU - 1166 (线段树单点更新)
- HDU 1166 敌兵布阵【线段树,树状数组入门题,单点更新,区间求和】
- hdu 1166 敌兵布阵(线段树,单点更新)
- HDU 1166 敌兵布阵(树状数组||线段树单点更新)
- HDU 1166 敌兵布阵【线段树 单点更新】
- HDU 1166 敌兵布阵 [线段树-单点更新]
- 线段树 hdu 1166 敌兵布阵 单点更新区间求和
- hdu 1166 敌兵布阵(线段树单点更新(a位置的值+/-b)+区间求和)
- HDU 1166 敌兵布阵[线段树单点更新成段查询]
- HDU 1166-敌兵布阵(线段树:单点更新,区间求和)
- HDU 1166 敌兵布阵 (线段树 单点更新)
- HDU 1166 敌兵布阵 线段树单点更新求和
- [ACM] hdu 1166 敌兵布阵 (线段树,单点更新)
- HDU 1166 敌兵布阵(线段树之单点更新)
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- HDU 1166 敌兵布阵(线段树单点更新)
- HDU 1166 敌兵布阵(线段树单点更新)
- hdu 1166 敌兵布阵 (线段树、树状数组模板,单点更新)