闲扯
我重心找错了,分治的时候没递归处理分治中心,直接处理子节点,结果还可以过题?????
我真的是佛了。。
题面
Solution
点分治的模板题。但是话说点分治不都是套模板吗。。
套路性的,我们先找到树的重心,以重心作为分治中心处理。
依次遍历中心的每一个子树,找到当前子树中的点到重心的距离。
依次枚举我们要求的每一个答案,用当前子树中的点和之前子树中的点拼凑出一条经过重心的链,判断是否合法,然后再将该子树中的节点加入备选集合中。
处理完后,删除重心,递归的处理剩下的子树。
时间复杂度: $O(nk\log n)$ 。
因为每次分治至少会让子树的大小变为当前树的大小的一半,所以一个节点最多被算 $\log$ 次。
Code
1 |
|
总结
写点分治的时候重心一定要找对,因为只是复杂的保证。
还有分治一定要记得是以重心为根,不然重心就用不上了。