zoukankan      html  css  js  c++  java
  • hdu 1698 线段树成段更新【学习报告】

      简单看了线段树的点更新什么的,后来发现还有成段更新。然后今天中午踢完球回来就开始死磕,终于把1698给AC了,然后还知道google ”pudge“,出来的全是dota里面的屠夫啊。哈哈,小娱乐。

      就是col数组是延迟更新。别的我也不说了,我会加在代码里面。

     1 #include <stdio.h>
     2 #define lson l,m,rt<<1
     3 #define rson m+1,r,rt<<1|1
     4 #define maxn 200000+10
     5 int col[maxn<<2];
     6 int sum[maxn<<2];
     7 void PushUp(int rt)
     8 {
     9     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    10 }
    11 void PushDown(int rt,int m)
    12 {
    13     if(col[rt])
    14     {
    15         col[rt<<1]=col[rt<<1|1]=col[rt];   //将此处概括的信息传递给下面
    16         sum[rt<<1]=(m-(m>>1))*col[rt];       //因为建树的关系,所以左子树会比右子树多一些
    17         sum[rt<<1|1]=(m>>1)*col[rt];
    18         col[rt]=0;                           //因为出现分歧了,所以不能概括该区间的颜色了
    19     }
    20 }
    21 void build(int l,int r,int rt)
    22 {
    23     col[rt]=0;
    24     sum[rt]=1;
    25     if(l==r)
    26         return;
    27     int m=(l+r)>>1;
    28     build(lson);
    29     build(rson);
    30     PushUp(rt);
    31 }
    32 void update(int L,int R,int c,int l,int r,int rt)
    33 {
    34     if(L<=l&&r<=R)
    35     {
    36         col[rt]=c;
    37         sum[rt]=c*(r-l+1);
    38         return;
    39     }
    40     PushDown(rt,r-l+1);            //先散下去,如果col[rt]为0的话则不用再散啦j
    41     int m=(r+l)>>1;
    42     if(L<=m)
    43         update(L,R,c,lson);
    44     if(R>m)
    45         update(L,R,c,rson);
    46     PushUp(rt);                    //散下去以后必然要收上来(指sum值,col值就不管了,col值只能从上往下传~)
    47 }
    48 int main()
    49 {
    50     int t,n,m,i,j;
    51     int t1,t2,t3;
    52     int cas=1;
    53     scanf("%d",&t);
    54     while(t--)
    55     {
    56         scanf("%d",&n);
    57         build(1,n,1);
    58         scanf("%d",&m);
    59         while(m--)
    60         {
    61             scanf("%d%d%d",&t1,&t2,&t3);
    62             update(t1,t2,t3,1,n,1);
    63         }
    64         printf("Case %d: The total value of the hook is %d.\n",cas++,sum[1]);
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    bzoj [Scoi2016]美味
    bzoj2200[Usaco2011 Jan]道路和航线
    bzoj3196 二逼平衡树 树套树(线段树套Treap)
    BZOJ3295 动态逆序对(树状数组套线段树)
    hdu 4819 Mosaic 树套树 模板
    bzoj2843 极地旅行社 LCT
    bzoj3874&2832 [Ahoi2014]宅男计划 模拟退火,三分
    bzoj3609 [Heoi2014]人人尽说江南好 博弈
    find命令进阶用法(一)
    find按照文件大小查找
  • 原文地址:https://www.cnblogs.com/symons1992/p/2857981.html
Copyright © 2011-2022 走看看