用来解决树上路径问题的算法
过程
每次找出树的重心,处理经过重心的路径再递归处理重心的子树
递归log层,每次遍历整个树,O(nlogn)。
应用
往往需要开一个桶来统计路径信息(条数),由于我们需要统计的是经过重心的路径,要避免子联通快自己内部的贡献,所以当我们更新一个子联通块的点时,要在桶中把这个子树的贡献去掉再更新。
还有一类题目询问是否有一种特殊的路径,我们可以对于每个分治重心,边插入子树边统计答案。
当然还有其他各种神仙转化。
USACO Cow at Large P
首先如果dis(root,x)>=dis(x,最近的叶子),那么只需要在最近的叶子处放一个人,就可以封住整颗x子树。
一棵子树的度数和为2*siz-1,如果每个点权为2-du,那么一棵子树的点权和为1,考虑处理跨过重心的答案,我们用权值和减去不合法的权值,也就是dis[u]+dis[v]>lef[v],这样算完后,合法的点一定组成森林,也就是可以看作在每个合法树的根产生贡献。
动态点分
思想与静态的大致相同,不过我们要把重心的递归先后顺序以一棵树的形式表示出来(每个分治重心的fa为上一层的重心)。