久未放晴的|

TulipeNoire

园龄:1年10个月粉丝:18关注:17

2024-2025 集训队互测 Round 13 - 线段树与区间加

前言:张定江的题,但是在讲课里面拉的,放在一堆答辩里面。这个题虽然是答辩,但是是有价值的。

题面有一百个锅。不过不影响做题就是了。

我们可以发现 ai=xSubtree(i)lzxlenx,故我们可以直接把 va 以特定方法加到 vb 上,然后问题变成求 vilzi,其中 v 是新算出来的点权。

考虑一个事情,令 wi=vivlcivrcifi=iSubtree(x)lzx,那么实际上要算的是 wifi 的值。这个东西有比较好的意义。我们找到一次修改操作遍历到并且不直接退出,要下传标记的节点,它们显然是两条相交链状的。把它们的 f 都清空。然后是所有完全包含于修改区间的节点,将它们的 f 都增加 k。现在唯一的问题就是如何找到完全包含于修改区间的节点。

我们考虑以如下方式对树上节点标号:

对于一条重链,我们先将链上的点依次标号,再递归对链上所有重儿子为右子树的点的左子树进行标号,也即是对以其为链头的重链进行标号。再对另一侧做同样的事情。

这样标号出来,我们发现,一个子树可以用 3 个区间表示,并且我们要得到的实际那些点上是对于某条链,链上每个点的不在链上的左/右子树的节点,这个在树剖时直接调用 O(logn) 个标号区间就可以了,因为其在上述标号规则下必定是连续的。修改的时候对两条链进行相应的寻找就可以了。

时间复杂度 O((n+m)log2n),细节有点多。

本文作者:TulipeNoire

本文链接:https://www.cnblogs.com/TulipeNoire/p/18640746/2024_2025_Homework_R13T1

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   TulipeNoire  阅读(24)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起