点分治
点分治
定义
树上的分治
先求一个点的答案,然后求子树
树上距离小于等于k的点对数量
枚举一个点 p 求解经过p的点对贡献,然后递归解决子树
为了降低分治复杂度,要求重心,求重心要限定子树范围内,添加 vis 防止上访,求dis也要
ans要减去在同一个子树
重心的子树小于 \(n/2\),所以调用递归最多 \(O(\log n)\) 次
分治不能解决具体问题,具体问题要具体分析
点分树
在静态的点分治的基础上维护一个高度为 \(O(logn)\) 的树形结构,这棵树上的点为当前做点分治时这个连通块的重心,边从一个根节点到他子树的重心
实现
get_root函数要调用两次,第二次是为了算出root子树的大小,方便下一次找重心。(其实调用一次也可以AC,而且更快,但是为了严谨,还是不要耍小聪明)
而且在每颗树上统计答案时,要统计他自己连出去的边,即考虑儿子和儿子路径的情况,也要考虑只有一个儿子连过来的情况。
复杂度
\(O(n \log n)\)

浙公网安备 33010602011771号