树链剖分算法解析

本文部分内容参考自 这篇博客 (写的很好 Orz ,建议大家也去看一下)

树链剖分是什么?用来做什么?

有一棵树,求解以下问题:
1将从 x 到 y 的路径上的每个结点权值增加 z
2求从 x 到 y 的路径上的每个结点的权值和/权值最大值/权值最小值

对于问题 1,我们可以用树上差分来求解。

对于问题 2,我们可以用类似前缀和的方法,求出每个点及其上面的点的权值和,利用 LCA ,减一减就得到了答案。

单独求解每个问题都很简单,这两种问题结合起来,上面的方法就不理想了。

而树链剖分可以巧妙地解决这一类问题。

一种对树链剖分直白的解释

树链剖分其实是把树的结点编号重组了,原先的每个结点都被分配了一个新的编号。

重新编号有什么好处?重新编号后的树,存在有若干条特殊的链,每条链上的编号都是连续的。

这就方便了我们使用线段树/树状数组等数据结构来快速对这些链上的结点进行求和/求最大最小值/修改。

猜你喜欢

转载自www.cnblogs.com/abc2237512422/p/10363193.html
今日推荐