大牛们的文章里这句 题意:O(-1) 思路:O(-1) 深深地嘲讽了我........
不过单点更新 区间求和也算是基本操作了吧 (虽然我还是看了好久才理解)
跟之前学图论的时候感觉完全不一样啊orz
#include <cstdio> #include <cstring> #include <queue> #include <vector> #include <algorithm> #define INF 0x3f3f3f3f #define lson l, m, root<<1 #define rson m+1, r, root<<1|1 using namespace std; const int MAXN = 5e4+10; int sum[MAXN*4]; void pushup(int root) { sum[root] = sum[root<<1] + sum[root<<1|1]; } void build(int l, int r, int root) { if(l == r) scanf("%d", &sum[root]); else{ int m = (l + r) >> 1; build(lson); build(rson); pushup(root); } } void update(int point, int val, int l, int r, int root) { if(l == r) sum[root] += val; else{ int m = (l + r) >> 1; if(point <= m) update(point, val, lson); else update(point, val, rson); pushup(root); } } int query(int L, int R, int l, int r, int root) { if(L <= l && R >= r) return sum[root]; int res = 0; int m = (l + r) >> 1; if(L <= m) res += query(L, R, lson); if(R > m) res += query(L, R, rson); return res; } int main() { int t, n; scanf("%d", &t); for(int kase = 1; kase <= t; kase++){ printf("Case %d:\n", kase); scanf("%d", &n); build(1, n, 1); char op[10]; while(scanf("%s", op), op[0] != ‘E‘){ int u, v; scanf("%d%d", &u, &v); if(op[0] == ‘A‘) update(u, v, 1, n, 1); else if(op[0] == ‘S‘) update(u, -v, 1, n, 1); else printf("%d\n", query(u, v, 1, n, 1)); } } return 0; }
原文:http://www.cnblogs.com/quasar/p/5156309.html