zoukankan      html  css  js  c++  java
  • HDU 1166 敌兵布阵 线段树,单点更新

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

    代码

    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 #define maxn 50000*4+5
     4 struct node {
     5     int l,r,val;
     6 }tr[maxn];
     7 void pushup(int rt)
     8 {
     9     tr[rt].val = tr[rt*2].val+tr[rt*2+1].val;
    10     return;
    11 }
    12 void build(int l,int r,int rt)
    13 {
    14     tr[rt].l = l;
    15     tr[rt].r = r;
    16     if(r == l)
    17     {
    18         scanf("%d",&tr[rt].val);
    19         return;
    20     }
    21     int m;
    22     m = (r+l)/2;
    23     build(l,m,rt*2);
    24     build(m+1,r,rt*2+1);
    25     pushup(rt);
    26 }
    27 void update(int target,int val,int rt)
    28 {
    29     int m;
    30     if(tr[rt].l == tr[rt].r){
    31         tr[rt].val += val;
    32         return;
    33     }
    34     m = (tr[rt].l+tr[rt].r)/2;
    35     if(target > m)
    36     update(target,val,rt*2+1);
    37     else
    38     update(target,val,rt*2);
    39     pushup(rt);
    40     return;
    41 }
    42 int ask(int l,int r,int rt)
    43 {
    44     if(tr[rt].l == l&& r == tr[rt].r)
    45     return tr[rt].val;
    46     int m;
    47     m = (tr[rt].l+tr[rt].r)/2;
    48     if(l > m)
    49     return ask(l,r,rt*2+1);
    50     else if(r <= m)
    51     return ask(l,r,rt*2);
    52     else
    53     return ask(l,m,rt*2)+ask(m+1,r,rt*2+1);
    54 }
    55 int main()
    56 {
    57     int t;
    58     scanf("%d",&t);
    59     int cas = 0;
    60     while(t--)
    61     {
    62         cas++;
    63         printf("Case %d:\n",cas);
    64         int n,i,j,k;
    65         char order[20];
    66         scanf("%d",&n);
    67         build(1,n,1);
    68         while(~scanf("%s",order))
    69         {
    70             if(order[0] == 'E')
    71             break;
    72             scanf("%d %d",&i,&j);
    73             if(order[0] == 'A')
    74             update(i,j,1);
    75             else if(order[0] == 'S')
    76             update(i,-j,1);
    77             else
    78             printf("%d\n",ask(i,j,1));
    79         }
    80     }
    81 }
  • 相关阅读:
    python列表切片
    python注释行与段落
    PCL安装与配置
    自动驾驶相关
    (转)ping命令
    (转)linux应用之test命令详细解析
    (转)shell解析命令行的过程以及eval命令
    (转)ssh-keygen 中文手册
    (转)stty 命令说明及使用讲解
    (转)CentOS下的trap命令
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2633101.html
Copyright © 2011-2022 走看看