专栏文章

长链剖分小技巧

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miozlshz
此快照首次捕获于
2025/12/03 03:44
3 个月前
此快照最后确认于
2025/12/03 03:44
3 个月前
查看原文
给定一棵树,有 nn 次操作,每次操作形如 x,d,zx,d,z(保证 dd 不超过 xx 子树内最大深度),你需要对 xx 子树外,距离 xx 恰好为 dd 的点 yy 执行 chkmin(ay,z)\text{chkmin}(a_y,z),求最终的数组 aa
首先对树进行长链剖分。然后考虑直接对树进行 dfs,维护一个数组 fif_i 表示已经处理完了子树外的所有操作,此时子树内深度为 ii 的点答案是 fif_i
考虑向下递归。首先往重儿子递归是简单的,因为操作的性质,所以每个子树内深度为 lenlen 的轻儿子只有 O(len)\mathcal O(len) 种本质不同的操作,暴力处理对 ff 的影响即可。
而往轻儿子递归的时候,其余轻儿子对他的贡献也是好算的,只需要记录每个深度中所有轻儿子操作的最小值和次小值。
然后对于重儿子对一个深度为 lenlen 的轻儿子的贡献,显然也只有 lenlen 种贡献,只需要把它找到即可。所以每个点额外维护一个 gig_{i} 表示 nownow 子树内的所有操作对子树外的影响延长出去 ii 的最小答案,也就是对于所有 (x,d,z)(x,d,z)d(depxdepnow)=id-(dep_x-dep_{now})=izz 的最小值。ii 的上界显然也是 nownow 子树深度,所以这个也是可以长链剖分维护的。
上面的 ff 处理了子树外操作的贡献,而 gg 也能处理对子树内操作的贡献。复杂度是 O(n)\mathcal O(n) 的。

评论

0 条评论,欢迎与作者交流。

正在加载评论...