• 【原创】hdu 1166 敌兵布阵(线段树→单点更新,区间查询)


      学习线段树的第三天。。。真的是没学点啥好的,又是一道水题,纯模板,我个人觉得我的线段树模板还是不错的(毕竟我第一天相当于啥都没学。。。找了一整天模板,对比了好几个,终于找到了自己喜欢的类型),中文题目嘛,直接上代码

      我感觉我的代码有一个特点吧...有点啰嗦,但是每一行的思维和上一行紧密相连,新手看的话不会感到思维的跃迁,比较容易看懂,因为我之前看一些大神的代码,确实看到一半就不知道他下面啥意思了...所以希望我的代码能够造福新手吧=。=

     1 #include<cstdio>
     2 #include<string>
     3 #include<iostream>
     4 #define N 50003
     5 using namespace std;
     6 int num[50003];
     7 char s[5];
     8 struct nod
     9 {
    10     int data,l,r;
    11 }tree[N*4];//树型结构的要花费更多的空间,这里要*4
    12 
    13 void push_up(int i)//通过i节点的孩子节点更新i节点
    14 {
    15     tree[i].data = tree[i*2].data + tree[i*2+1].data;
    16 }
    17 
    18 void Build_tree(int i,int l,int r)
    19 {
    20     tree[i].l = l;
    21     tree[i].r = r;
    22     if(l == r){
    23         tree[i].data = num[l];
    24         return ;
    25     }
    26     int mid = (l + r)/2;
    27     Build_tree(i*2,l,mid);
    28     Build_tree(i*2+1,mid+1,r);
    29     push_up(i);
    30 }
    31 
    32 void update(int i,int k,int v)
    33 {
    34     if(tree[i].l==k&&tree[i].r==k){//单点更新只要找到特定的k节点就算找到,区间更新要找到一个区间→看我另一篇文章吧
    35         tree[i].data += v;//注意题目意思是增加或减少V个人,所以是+=
    36         return;
    37     }
    38     int mid = (tree[i].l + tree[i].r)/2;
    39     if(k <= mid)
    40         update(i*2,k,v);
    41     else
    42         update(i*2+1,k,v);
    43     push_up(i);
    44 }
    45 
    46 int query(int i,int l,int r)
    47 {
    48     if(l<=tree[i].l&&tree[i].r<=r){
    49         return tree[i].data;
    50     }
    51     int mid = (tree[i].l + tree[i].r)/2;
    52     if(r <= mid)      //这里看不懂的看我另一篇文章http://www.cnblogs.com/liwenchi/p/5761257.html
    53         return query(i*2,l,r);
    54     if(l > mid)
    55         return query(i*2+1,l,r);
    56     return query(i*2,l,r)+query(i*2+1,l,r);
    57 }
    58 
    59 int main()
    60 {
    61     int noc,ug;    //ug这名字随便起的...case数等于ug-noc,noc也是随便起的...number of case
    62     scanf("%d",&noc);
    63     ug = noc;
    64     while(noc--)
    65     {
    66         int n,l,r,i,j;
    67         scanf("%d",&n);
    68         for(int i=1;i<=n;i++)
    69             scanf("%d",&num[i]);
    70         Build_tree(1,1,n);
    71         printf("Case %d:
    ",ug-noc);
    72         while(scanf("%s",s))
    73         {
    74             if(s[0] == 'E') break;
    75             if(s[0] == 'Q'){
    76                 scanf("%d%d",&l,&r);
    77                 printf("%d
    ",query(1,l,r));
    78             }
    79             else if(s[0] == 'A'){
    80                 scanf("%d%d",&i,&j);
    81                 update(1,i,j);
    82             }
    83             else{
    84                 scanf("%d%d",&i,&j);//减人数的话把j取负再更新就OK了
    85                 update(1,i,-j);
    86             }
    87         }
    88     }
    89 }

    如果有哪里不懂可以看看我其他线段树的文章,都是很基础的!

  • 相关阅读:
    go 资料
    BW:如何加载和生成自定义的层次结构,在不使用平面文件的SAP业务信息仓库
    权限变量 --转载
    BW CUBE 数据的聚集和压缩
    BW基于ALE的主数据增量机制分析
    SAP-GR/IR的理解
    SDN论坛看到BW的问题及相关解答
    Step by step Process of creating APD
    处理链方式执行APD处理
    BW标准数据源初始化设置
  • 原文地址:https://www.cnblogs.com/liwenchi/p/5764647.html
Copyright © 2020-2023  润新知