蒟蒻的数列
我们先不考虑动态开点怎么开,先想一下普通线段树怎么做
我们需要注意到题目中一个比较显眼的提示:只要求最终数列的所有元素和
这提示我们不用时时刻刻维护每个节点的和
那我们维护什么呢?
由于是要把小于\(k\)的数变成\(k\),我们可以尝试记录每个节点的最小值
在任意时刻,根据我们对lazy的理解,一个节点的真实最小值是从这个节点走到根节点的路径中所有节点的lazy值的最大值
所以我们下传的时候注意维护lazy的最大值,上传的时候维护最小值即可
但也有另一种写法:
首先注意一细节:p在函数参数表里面是引用
然后,这里修改的时候不用下传和上传,这么做的话,对于线段树的非叶子节点其实是不满足我们对lazy的理解的(即某个时刻一个非叶子节点的真实最小值不一定是从这个节点走到根节点的路径中所有节点的lazy值的最大值)
但是由于我们在最终统计的时候只统计整个数列,所以可以只关心每个叶子节点的值,每次对区间的修改都会体现在线段树的某个节点上面,所以对于叶子来说,他的真实最小值是可以按照我们对lazy的理解来求的
如果一个节点的某个儿子节点没有被开通,那么这个儿子节点所代表的所有叶子节点走到根节点的lazy最大值就是当前这个节点的lazy,因为前面一直在下放
update 2024.5.18
其实上面的做法根本就不是懒标记,而是标记永久化
update 2024.7.29
下放的代码见Hydro OJ提交