线段树,不要依赖模板

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;


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

posted @ 2017-02-16 21:41  largecube233  阅读(100)  评论(0编辑  收藏  举报