树链剖分
Posted caterpillor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树链剖分相关的知识,希望对你有一定的参考价值。
O 树链剖分的本质是把一棵树映射到线段上,且树被剖出来的链是连续的一段。看下图:
树剖的方法是先剖重的,这样dfs,并记录时间戳,也就是dfs序的序号。上图映射到线段上就是:
其中加括号的区间是重链部分。
O 那么这样做有什么好处?
比如我们要将树上某一路径x到y(比如7点-13点)上的点权值都+z,可以转化为在序列上进行。方法是:首先判断两个点的top[]是否相同,如果相同说明就在一个重链上,直接用线段树去处理。如若不然,判断dep(top[7])和dep(top[13]),即两个点的top[]值的深度。深的为7,浅的是13,那么先计算7-top[7],将该区间+z,区间更新使用线段树。走到top[7]后,将x = fa[top[7]],跳到1号点。重复判断两个点的top[]是否相同,如果不相同,继续判断dep[top[x]]和dep[top[13]],以此类推。
可以看出树上的问题转到序列上就是处理区间[8,9],[1,4]的问题,使用线段树即可。
O 又如将x(例如4)的子树节点权值都+z,在序列上就是区间[2,6]的区域。我们可以在 dfs过程中记录子树大小size[x],那么就用线段树处理学序列上的区间[x,x+size[x]-1]了。
O 其余的树链剖分方法看博客:
https://www.cnblogs.com/ivanovcraft/p/9019090.html
以上是关于树链剖分的主要内容,如果未能解决你的问题,请参考以下文章