zoukankan      html  css  js  c++  java
  • hdu 1166 敌兵布阵 【线段树】

    好好学一下线段树----

    从0开始----加油~

    单点更新的

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<vector>
     7 using namespace std;
     8 #define lp (p << 1)
     9 #define rp (p << 1 | 1)
    10 #define getmid(l,r) (l + (r - l) / 2)
    11 
    12 const int maxn = 50005;
    13 struct node{
    14     int l,r,s;
    15 }t[4*maxn];
    16 
    17 int a[maxn],n;
    18 
    19 int calc(int a,int b) { return a+b; }
    20 
    21 void Push_up(int p){
    22     t[p].s = calc(t[lp].s,t[rp].s);
    23 }
    24 
    25 void Build_tree(int p,int l,int r){
    26     t[p].l = l;
    27     t[p].r = r;
    28     if(l == r){ t[p].s = a[l];return;}
    29     int mid = getmid(l,r);
    30     Build_tree(lp,l,mid);
    31     Build_tree(rp,mid+1,r);
    32     Push_up(p);
    33 }
    34 
    35 void update(int p,int s,int w){//给s点加上w 
    36     if(t[p].l == t[p].r) {
    37         t[p].s += w;
    38         return;
    39     }
    40     int mid = getmid(t[p].l,t[p].r);
    41     if(s <= mid) update(lp,s,w);
    42     else update(rp,s,w);
    43     Push_up(p);        
    44 }
    45 
    46 int sum(int p,int l,int r){
    47     if(t[p].l == l && t[p].r == r) return t[p].s;
    48     
    49         int mid = getmid(t[p].l,t[p].r);
    50         if(r <= mid) return sum(lp,l,r);
    51         else if(mid < l) return sum(rp,l,r);
    52          else return calc(sum(lp,l,mid),sum(rp,mid+1,r));
    53 }
    54 
    55 int main(){
    56     int T;
    57     scanf("%d",&T);
    58     int kase = 0;
    59     while(T--){
    60         scanf("%d",&n);
    61         for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
    62         Build_tree(1,1,n);
    63         
    64     //    for(int i = 1;i <= n;i++)
    65     //    printf("t[%d].l = %d  t[%d].r = %d  t[%d].s = %d
    ",i,t[i].l,i,t[i].r,i,t[i].s);
    66         
    67         char cmd[10];
    68         int x,y;
    69         printf("Case %d:
    ",++kase);
    70         while(cin >> cmd){
    71             if(cmd[0] == 'E') break;
    72             else if(cmd[0] == 'A'){
    73             scanf("%d %d",&x,&y);
    74             update(1,x,y);
    75             }
    76             else if(cmd[0] == 'S'){
    77             scanf("%d %d",&x,&y);
    78             update(1,x,-y);
    79             }
    80             else{
    81                 scanf("%d %d",&x,&y);
    82                 printf("%d
    ",sum(1,x,y));
    83             }
    84         }    
    85     }
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    P1064 金明的预算方案
    P1164 小A点菜
    P1346 电车
    01背包二进制优化
    2018暑期多校1
    牛课第二次多校I
    STL
    Reachability from the Capital
    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
    P3387 【模板】缩点
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4685857.html
Copyright © 2011-2022 走看看