HDU 1166 敌兵布阵
2012-08-09 21:14
204 查看
线段树。代码如下:
#include<iostream> #include<cstring> #include<cstdio> #define max 50002 using namespace std; typedef struct { int l, r; int val; }node; node w[4*max]; void pushup(int rt) { w[rt].val=w[rt<<1].val+w[rt<<1|1].val; } void build(int l, int r, int rt) { w[rt].l=l; w[rt].r=r; if (l == r) { scanf("%d", &w[rt].val); return ; } int m=(l+r)>>1; build(l, m, rt<<1); build(m+1, r, rt<<1|1); pushup(rt); } void update(int p, int v, int rt) { if (w[rt].l == w[rt].r) { w[rt].val+=v; return ; } int m=(w[rt].l+w[rt].r)>>1; if (p <= m) update(p, v, rt<<1); else update(p, v, rt<<1|1); pushup(rt); } int query(int L, int R, int rt) { if (w[rt].l == L && w[rt].r == R) return w[rt].val; int m=(w[rt].l+w[rt].r)>>1; if (L > m) { return query(L, R, rt<<1|1); } else if (R <= m) { return query(L, R, rt<<1); } else { return query(L, m, rt<<1)+query(m+1, R, rt<<1|1); } } int main() { int T, n, i, a, b; char s[10]; scanf("%d", &T); for (i=1; i<=T; i++) { printf("Case %d:\n", i); scanf("%d", &n); build(1, n, 1); while(scanf("%s", s), s[0] != 'E') { if (s[0] == 'A') { scanf("%d%d", &a, &b); update(a, b, 1); } else if (s[0] == 'S') { scanf("%d%d", &a, &b); update(a, -b, 1); } else if (s[0] == 'Q') { scanf("%d%d", &a, &b); printf("%d\n", query(a, b, 1)); } } } return 0; }
相关文章推荐
- HDU 1166 敌兵布阵 【简单的树状数组||线段树】
- 【线段树I:母题】hdu 1166 敌兵布阵
- HDU1166敌兵布阵-线段树求和
- HDU-1166-敌兵布阵【树状数组讲解笔记】
- HDU_1166 敌兵布阵
- [ACM_数据结构] HDU 1166 敌兵布阵 线段树 或 树状数组
- 【树状数组 单点修改,区间求值】hdu 1166 敌兵布阵
- HDU 1166 敌兵布阵(树状数组)
- HDU 1166 敌兵布阵(线段树 单点更新)
- HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>
- HDU 1166 敌兵布阵 //线段树单点更新
- HDU1166敌兵布阵 简单线段树
- hdu 1166 敌兵布阵(线段树点区)
- HDU-1166 敌兵布阵 线段树|树状数组
- hdu 1166 敌兵布阵(线段树入门-单点更新)
- HDU - 1166 敌兵布阵(初学线段树)
- hdu 1166 敌兵布阵(树状数组)
- HDU 1166 敌兵布阵 算法学习:线段树
- HDU 1166 敌兵布阵(线段树)
- HDU 1166 敌兵布阵