点分治

点分治

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和子树大小

posted @ 2024-02-22 20:50  zhy_learn  阅读(4)  评论(0编辑  收藏  举报