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:\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)