线段树(单点更新(模板)) 之 hdu 1166
2014-07-24 20:49
369 查看
// [7/24/2014 Sjm] /* 第一道用线段树做的题,照着大神的代码风格写的,,就当作线段树单点更新的模板吧。。。。(当年用树状数组做的:代码见这里) */
#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 #define GetMid l + ((r-l) >> 1) 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) { if (l == r) { scanf("%d", &sum[rt]); return; } int m = GetMid; Build(lson); Build(rson); PushUp(rt); } void Update(int pos, int add, int l, int r, int rt) { if (l == r) { sum[rt] += add; return; } int m = GetMid; if (pos <= m) { Update(pos, add, lson); } else { Update(pos, add, rson); } PushUp(rt); } int Query(int L, int R, int l, int r, int rt) { if (L <= l && r <= R) { return sum[rt]; } int ret = 0; int m = GetMid; if (L <= m) { ret += Query(L, R, lson); } if (R > m) { ret += Query(L, R, rson); } return ret; } int main() { //freopen("input.txt", "r", stdin); int T, N, a, b; scanf("%d", &T); for (int cas = 1; cas <= T; ++cas) { printf("Case %d:\n", cas); scanf("%d", &N); Build(1, N, 1); char str[10]; while (scanf("%s", str) && 'E' != str[0]) { scanf("%d %d", &a, &b); if ('Q' == str[0]) { printf("%d\n", Query(a, b, 1, N, 1)); } else { if ('A' == str[0]) { Update(a, b, 1, N, 1); } else { Update(a, -b, 1, N, 1); } } } } return 0; }
相关文章推荐
- hdu 1166 敌兵布阵 (线段树、树状数组模板,单点更新)
- 线段树单点更新模板 HDU-1166
- HDU - 1166 A - 敌兵布阵 线段树单点更新模板
- HDU(1166),线段树模板,单点更新,区间总和
- 线段树(单点更新(模板)) 之 hdu 1166
- HDU 1166-敌兵布阵【树状数组&&线段树单点更新】【模板】
- kuangbin专题七:A题 HDU 1166 敌兵布阵(单点更新,区域查询求和的线段树模板)
- 线段树 : hdu 1166 示例 [ 单点更新 ]
- hdu 1166 敌兵布阵(线段树,单点更新)
- 线段树入门[单点更新] 敌兵布阵 HDU 1166
- hdu 1166(线段树,单点更新)
- 线段树入门 单点更新 hdu 1751 I Hate It hdu 1166 敌兵布阵
- hdu 1166 敌兵布阵 线段树 单点更新
- [ACM] hdu 1166 敌兵布阵 (线段树,单点更新)
- HDU 1166 敌兵布阵(线段树 单点更新)
- HDU 1166 单点更新 线段树
- HDU 1166 线段树基础题目单点更新
- hdu 1166 敌兵布阵(线段树——单点更新)
- hdu 1166 敌兵布阵(线段树-单点更新)
- hdu 1166 敌兵布阵(线段树-单点更新)