zoukankan      html  css  js  c++  java
  • hdu1166敌兵布阵(线段树)

    线段树 单点更新

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

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 int sum[1000001];
     4 void push(int w)
     5 {
     6     sum[w] = sum[2*w]+sum[2*w+1];//更新节点值
     7 }
     8 void build(int l,int r,int w)
     9 {
    10     if(l==r)
    11     {
    12         scanf("%d",&sum[w]);
    13         return;
    14     }
    15     int m = (l+r)/2;
    16     build(l,m,2*w);
    17     build(m+1,r,2*w+1);
    18     push(w);
    19 }
    20 void add(int p,int d,int l,int r,int w)
    21 {
    22     if(l==r)
    23     {
    24         sum[w]+=d;
    25         return ;
    26     }
    27     int m = (l+r)/2;
    28     if(p<=m)
    29         add(p,d,l,m,2*w);
    30     else
    31         add(p,d,m+1,r,2*w+1);
    32     push(w);
    33 }
    34 int query(int p1,int p2,int l,int r,int w)
    35 {
    36     if(p1<=l&&p2>=r)//区间被完全覆盖
    37         return sum[w];    
    38     int m = (l+r)/2;
    39     int re = 0;
    40     if(p1<=m)
    41         re+=query(p1,p2,l,m,2*w);
    42     if(p2>m)
    43         re+=query(p1,p2,m+1,r,2*w+1);
    44     return re;
    45 }
    46 int main()
    47 {
    48     int i,j,k,n,t,a,b;
    49     char c[11];
    50     scanf("%d", &t);
    51     for(i = 1; i <= t ; i++)
    52     {
    53         memset(sum,0,sizeof(sum));
    54         scanf("%d", &n);
    55         build(1,n,1);        
    56         getchar();
    57         printf("Case %d:\n",i);
    58         while(scanf("%s",c)!=EOF)
    59         {
    60             if(strcmp(c,"End")==0)
    61             break;
    62             if(strcmp(c,"Add")==0)
    63             {
    64                 scanf("%d%d", &a,&b);
    65                 add(a,b,1,n,1);
    66             }
    67             if(strcmp(c,"Sub")==0)
    68             {
    69                 scanf("%d%d", &a,&b);
    70                 add(a,-b,1,n,1);
    71             }
    72             if(strcmp(c,"Query")==0)
    73             {
    74                 scanf("%d%d", &a,&b);            
    75                 printf("%d\n",query(a,b,1,n,1));
    76             }
    77         }
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    BNU Online Judge-29140
    HDU-1022-Train Problem I
    HDU-1312-Red and Black
    BNU Online Judge-34978-汉诺塔
    BNU Online Judge-34976-数细菌
    BNU Online Judge-34973-Liserious战队
    HDU-1010-Tempter of the Bone
    HDU-1518-Square
    thinkphp笔记
    1210. 连号区间数
  • 原文地址:https://www.cnblogs.com/shangyu/p/2609394.html
Copyright © 2011-2022 走看看