点分治
点分治
P3806 【模板】点分治1
直接从版题开始
题目大意是给定大小为n的树,给m个询问k,求树上是否有两点距离为k
首先点分治的本质:对于一个根节点,只有两种路径,过这个点的,和不过的
然后就先处理过这个点的,然后递归处理每个子树
这时注意,每次选树的重心,时间复杂度就可以达到稳定\(O(n\log n)\)
然后考虑本题,我们要做的就变成了过一个点的路径是否有距离为k(所以要注意判选的两个点不能再同个子树)
解法1
用时间复杂度为\(O(n\log^2n+nmlogn)\)的算法
首先扫出子树到该点的距离,理论上要算\(n\log n\)次(就是时间复杂度)
然后排序,对于每个k,两个指针l,r从两边扫,可以得出答案
解法2
用时间复杂度为\(O(n\log n+nmlogn)\)的算法
直接用桶记录,枚举m和子树大小