HDU (线段树 单点更新) 敌兵布阵

哎,又切了一天的水题。

线段树果然必须自己写出来才能叫真正的会了,之前一直在套模板确实不好。

这个题目是单点更新 之 单点增减,= ̄ω ̄=

 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:
", 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
", 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 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4456323.html