点分治

点分治

定义

树上的分治

先求一个点的答案,然后求子树

树上距离小于等于k的点对数量

枚举一个点 p 求解经过p的点对贡献,然后递归解决子树

为了降低分治复杂度,要求重心,求重心要限定子树范围内,添加 vis 防止上访,求dis也要

ans要减去在同一个子树

重心的子树小于 \(n/2\),所以调用递归最多 \(O(\log n)\)

分治不能解决具体问题,具体问题要具体分析

点分树

在静态的点分治的基础上维护一个高度为 \(O(logn)\) 的树形结构,这棵树上的点为当前做点分治时这个连通块的重心,边从一个根节点到他子树的重心

实现

get_root函数要调用两次,第二次是为了算出root子树的大小,方便下一次找重心。(其实调用一次也可以AC,而且更快,但是为了严谨,还是不要耍小聪明)

而且在每颗树上统计答案时,要统计他自己连出去的边,即考虑儿子和儿子路径的情况,也要考虑只有一个儿子连过来的情况。

复杂度

\(O(n \log n)\)

posted @ 2024-02-04 12:40  妖灵梦  阅读(16)  评论(0)    收藏  举报