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 }
原文地址:https://www.cnblogs.com/symons1992/p/2857981.html