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 }

 

posted on 2013-01-12 21:26 symons 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/symons1992/archive/2013/01/12/2857981.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值