HDU 1166(线段树;树状数组)
2014-01-14 23:07
316 查看
题意:如题。
树状数组:
线段树:
树状数组:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[50009]; int lowbit(int n) { return n&-n; } int sum(int end) { int s = 0; while (end > 0) { s += a[end]; end -= lowbit(end); } return s; } void plus(int pos, int num, int up) { while (pos <= up) { a[pos] += num; pos += lowbit(pos); } } int main() { int T, N, i, n, m, t = 0; char s[20]; scanf("%d", &T); while (T--) { printf("Case %d:\n", ++t); scanf("%d", &N); memset(a+1, 0, sizeof(int) * N); for (i = 1; i <= N; ++i) { scanf("%d", &n); plus(i, n, N); } while (scanf("%s", s), s[0] != 'E') { scanf("%d%d", &n, &m); if (s[0] == 'Q') printf("%d\n", sum(m) - sum(n-1)); else if (s[0] == 'A') { plus(n, m, N); } else plus(n, -m, N); } } }
线段树:
#include <cstdio> #include <cstring> const int maxn = 50009; int sum[maxn<<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 = (l+r) >> 1; build(l, m, rt<<1); build(m+1, r, rt<<1|1); pushUP(rt); } void update(int p, int add, int l, int r, int rt) { if (l == r) { sum[rt] += add; return; } int m = (l+r) >> 1; if (p <= m) update(p, add, l, m, rt<<1); else update(p, add, m+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 m = (l + r) >> 1; int ret = 0; if (L <= m) ret += query(L, R, l, m, rt<<1); if (R > m) ret += query(L, R, m+1, r, rt<<1|1); return ret; } int main() { int T, n; scanf("%d", &T); for (int cas = 1; cas <= T; ++cas) { printf("Case %d:\n", cas); scanf("%d", &n); build(1, n, 1); char op[10]; while (scanf("%s", op)) { if (op[0] == 'E') break; int a, b; scanf("%d%d", &a, &b); if (op[0] == 'Q') printf("%d\n", query(a, b, 1, n, 1)); else if (op[0] == 'S') update(a, -b, 1, n, 1); else update(a, b, 1, n, 1); } } return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- 线段树题集
- zoj3549 快速幂
- 浅谈manacher算法 最长回文子串(Longest Palindromic Substring)
- NWERC2010 NKOJ2178 Stock Prices
- 2011ACM福州网络预选赛B题 HDU4062 Abalone
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- POJ挑战赛3(POJ Challenge Round 3)题解
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087