zoukankan      html  css  js  c++  java
  • HDU 1166

    裸的普通单点更新线段树,基本按照http://www.notonlysuccess.com/index.php/segment-tree-complete/1:1拍的。。。

     1 #include <cstdio>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 #define MAXN    65536
     6 int _v[MAXN << 1];
     7 int *const v = &_v[-1];
     8 
     9 #define lsp    p<<1
    10 #define rsp    lsp | 1
    11 #define pushup(p) (v[p] = v[lsp] + v[rsp])
    12 #define lso    l, m, lsp
    13 #define rso m+1, r, rsp
    14 
    15 void build(int l, int r, int p)
    16 {
    17     if (l == r) scanf("%d", &v[p]);
    18     else {
    19         int m = l+r >> 1;
    20         build(lso), build(rso);
    21         pushup(p);
    22 
    23     }
    24 }
    25 
    26 void update(int o, int val, int l, int r, int p)
    27 {
    28     if (l == r) v[p] += val;
    29     else {
    30         int m = l+r >> 1;
    31         if (o <= m) update(o, val, lso);
    32         else update(o, val, rso);
    33         pushup(p);
    34 
    35     }
    36 }
    37 
    38 int query(int L, int R, int l, int r, int p)
    39 {
    40     if (L<=l && r<=R) return v[p];
    41     else {
    42         int m = l+r >> 1;
    43         return (L <= m ? query(L,R, lso) : 0) + (R > m  ? query(L, R, rso) : 0);
    44     }
    45 }
    46 
    47 
    48 
    49 int main(void)
    50 {
    51 //    freopen("hdu1166.txt", "r", stdin);
    52     char s[6];
    53     int T, N;
    54     scanf("%d", &T);
    55     for(int t = 1; t<=T; ++t) {
    56         scanf("%d", &N);
    57         build(1, N, 1);
    58         printf("Case %d:
    ", t);
    59         while(scanf("%s", s), s[0] != 'E') {
    60             if (s[0] == 'Q'){
    61                 int L, R;
    62                 scanf("%d%d", &L, &R);
    63                 printf("%d
    ", query(L, R, 1, N, 1));
    64             } else if (s[0] == 'A') {
    65                 int O, Oval;
    66                 scanf("%d%d", &O, &Oval);
    67                 update(O, Oval, 1, N, 1);
    68 
    69             } else {
    70                 int O, Oval;
    71                 scanf("%d%d", &O, &Oval);
    72                 update(O, -Oval, 1, N, 1);
    73             }
    74         }
    75     }
    76     return 0;
    77 }
    2014-06-03 20:46:26 Accepted 1166 328MS 716K 1400 B G++
  • 相关阅读:
    String类的常用方法
    StringBuffer和String的区别
    docker安装kali
    6.找素数
    5.三羊献瑞
    4.迷宫大逃亡
    3.百米
    2.后台登录
    1.猴子吃桃
    深入理解Docker容器和镜像
  • 原文地址:https://www.cnblogs.com/e0e1e/p/hdu_1166.html
Copyright © 2011-2022 走看看