哎,又切了一天的水题。
线段树果然必须自己写出来才能叫真正的会了,之前一直在套模板确实不好。
这个题目是单点更新 之 单点增减,= ̄ω ̄=
1 #include <cstdio> 2 3 const int maxn = (1 << 20); 4 5 int n, qL, qR, p, v, sum[maxn]; 6 7 void build(int o, int L, int R) 8 { 9 if(L == R) { scanf("%d", &sum[o]); return; } 10 int M = (L + R) / 2; 11 build(o*2, L, M); 12 build(o*2+1, M+1, R); 13 sum[o] = sum[o*2] + sum[o*2+1]; 14 } 15 16 void update(int o, int L, int R) 17 { 18 if(L == R) { sum[o] += v; return; } 19 int M = (L + R) / 2; 20 if(p <= M) update(o*2, L, M); 21 else update(o*2+1, M+1, R); 22 sum[o] = sum[o*2] + sum[o*2+1]; 23 } 24 25 int query(int o, int L, int R) 26 { 27 if(qL <= L && qR >= R) return sum[o]; 28 29 int ans = 0; 30 int M = (L +R) / 2; 31 if(qL <= M) ans += query(o*2, L, M); 32 if(qR > M) ans += query(o*2+1, M+1, R); 33 return ans; 34 } 35 36 char cmd[10]; 37 38 int main() 39 { 40 //freopen("in.txt", "r", stdin); 41 42 int T; scanf("%d", &T); 43 44 for(int kase = 1; kase <= T; kase++) 45 { 46 printf("Case %d:\n", kase); 47 48 scanf("%d", &n); 49 build(1, 1, n); 50 51 while(scanf("%s", cmd) == 1) 52 { 53 if(cmd[0] == ‘E‘) break; 54 if(cmd[0] == ‘Q‘) 55 { 56 scanf("%d%d", &qL, &qR); 57 printf("%d\n", query(1, 1, n)); 58 } 59 else 60 { 61 scanf("%d%d", &p, &v); 62 if(cmd[0] == ‘S‘) v = -v; 63 update(1, 1, n); 64 } 65 } 66 } 67 68 return 0; 69 }
原文:http://www.cnblogs.com/AOQNRMGYXLMV/p/4456323.html