本文部分内容参考自 这篇博客 (写的很好 Orz ,建议大家也去看一下)
树链剖分是什么?用来做什么?
有一棵树,求解以下问题:
1将从 x 到 y 的路径上的每个结点权值增加 z
2求从 x 到 y 的路径上的每个结点的权值和/权值最大值/权值最小值
对于问题 1,我们可以用树上差分来求解。
对于问题 2,我们可以用类似前缀和的方法,求出每个点及其上面的点的权值和,利用 LCA ,减一减就得到了答案。
单独求解每个问题都很简单,这两种问题结合起来,上面的方法就不理想了。
而树链剖分可以巧妙地解决这一类问题。
一种对树链剖分直白的解释
树链剖分其实是把树的结点编号重组了,原先的每个结点都被分配了一个新的编号。
重新编号有什么好处?重新编号后的树,存在有若干条特殊的链,每条链上的编号都是连续的。
这就方便了我们使用线段树/树状数组等数据结构来快速对这些链上的结点进行求和/求最大最小值/修改。