题解:P12489 [集训队互测 2024] 线段树与区间加
EastSnowLotus · · 题解
好像发错号了。
为什么要过题才能发题解?
首先注意到
记
因为 pushdown 之后的变化比较阴间,但是注意到如果我们考虑维护每个点到根的链上的 lazytag 之和,就会发现 pushdown 的时候等价于链上清空,而其他位置不会发生变化。
于是我们考虑在每个位置记录其到根的 lazytag 之和,这样当我们进行区间加的时候,实际上就等价于进行以下两个操作:
- 将一条链上所有的
a_i 改为0 ; - 将一条链内部所有点的
a_i 都加上k ; - 查询
\sum (a_i-a_{f_i})v_i 。
首先查询里面那个差分的系数可以也合并进
考虑修改一下树剖的 dfs 序:对于一条重链,先从上到下依次遍历重链上的点,接着从下往上依次遍历链上的点的轻左子树(没有就跳过),最后从下往上依次遍历链上的点的轻右子树。
于是容易发现此时一条重链上的这些子树可以用上面的顺序中
这样直接用一个普通的区间赋值区间加求带权和的线段树维护,总时间复杂度