2024-2025 集训队互测 Round 13 - 线段树与区间加
前言:张定江的题,但是在讲课里面拉的,放在一堆答辩里面。这个题虽然是答辩,但是是有价值的。
题面有一百个锅。不过不影响做题就是了。
我们可以发现 \(a_i=\sum\limits_{x\in \text{Subtree}(i)}lz_x\cdot len_x\),故我们可以直接把 \(va\) 以特定方法加到 \(vb\) 上,然后问题变成求 \(\sum v_i\cdot lz_i\),其中 \(v\) 是新算出来的点权。
考虑一个事情,令 \(w_i=v_i-v_{lc_i}-v_{rc_i}\),\(f_i=\sum\limits_{i\in \text{Subtree}(x)}lz_x\),那么实际上要算的是 \(\sum w_i\cdot f_i\) 的值。这个东西有比较好的意义。我们找到一次修改操作遍历到并且不直接退出,要下传标记的节点,它们显然是两条相交链状的。把它们的 \(f\) 都清空。然后是所有完全包含于修改区间的节点,将它们的 \(f\) 都增加 \(k\)。现在唯一的问题就是如何找到完全包含于修改区间的节点。
我们考虑以如下方式对树上节点标号:
对于一条重链,我们先将链上的点依次标号,再递归对链上所有重儿子为右子树的点的左子树进行标号,也即是对以其为链头的重链进行标号。再对另一侧做同样的事情。
这样标号出来,我们发现,一个子树可以用 \(3\) 个区间表示,并且我们要得到的实际那些点上是对于某条链,链上每个点的不在链上的左/右子树的节点,这个在树剖时直接调用 \(\mathcal O(\log n)\) 个标号区间就可以了,因为其在上述标号规则下必定是连续的。修改的时候对两条链进行相应的寻找就可以了。
时间复杂度 \(\mathcal O((n+m)\log^2n)\),细节有点多。

浙公网安备 33010602011771号