线段树,不要依赖模板

懒标记的误区
本文通过一道二维线段树题目,探讨了线段树中懒标记的使用时机,并指出并非所有区间操作都需要懒标记,有时只需记录历史最大值即可。

https://www.luogu.org/problem/show?pid=3437
今天做题,做到了这个,二维线段树;
不会的我便仔细研究起hzwer的代码;
明明是区间修改,为什么没有lazy?
这个问题我算法不解;
我这几天,做了不少线段树的题目,也看到了很多优秀的代码模板;
但他们都有一个共性——凡是跟区间有关系的,无一不用lazy来延迟修改;
我问同学们:lazy什么时候要用;
A:区间修改要用;
渐渐地,我的闹钟形成了一中思想,线段树凡和区间打上边的,无疑需要lazy,无一不用lazy;

现在我们维护一个简单的胜者树,当然了,我们加一个条件
给定一个区间 x y,再给一个值z
表示你先求出x y区间的最大值,再把最大值加上z,再去把区间xy的所有值全部变成那个加了z以后的最大值;
我第一个念头——lazy无脑暴力;
但是呢,但是呢
其实我们并不需要lazy的下传函数,我们只要给每个区间再加一个变量tag,表示历史上给这个区间全部赋值的最大值;
我们并不要再每次使用前去把这个值下传,我们只要当有一个值会把这个区间全部覆盖时更新一下tag,等到询问最大值的时候,无论询问的区间是否全包括当前的num区间,先把ans=T[num].tag,再去向下面搜索,比较;
很显然啊,因为tag是全部覆盖这个区间的,而我们只是求一下区间的最大值,所以并不要下传,仅仅只是比较一下就可以了;
因为题目的背景,所以每次修改,值都会变大,所以我们相当与再求历史最大值;
假如体面再改成
把xy区间全部变成z,那虽然我tag以前把整个区间都覆盖了,但是现在可能有较小值的会破坏这个区间,所以我们不得不lazy;


以往我总是喜欢学习人家的代码,但这无脑学习中,却渐渐丧失了思考能力,我想,为什么我比赛连一半的难题都想不出来,恐怕就是因为这个无脑的依赖性吧;

转载于:https://www.cnblogs.com/largecube233/p/6797954.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值