首页 > 其他 > 详细

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

时间:2015-04-25 19:33:14      阅读:153      评论:0      收藏:0      [点我收藏+]

哎,又切了一天的水题。

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

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

技术分享
 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 }
代码君

 

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

原文:http://www.cnblogs.com/AOQNRMGYXLMV/p/4456323.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!