洛谷 P3806 【模板】点分治1
原题链接 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在。 输入输出格式 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行每行询问一个K 输出格式: 对于每个K每行输出一个答案,存在输出“AYE”,否则输出”NAY”(不包含引号) 输入输出样例 输入样例#1: 复制 2 1 1 2 2 2 输出样例#1: 复制 AYE 说明 对于30%的数据n<=100 对于60%的数据n<=1000,m<=50 对于100%的数据n<=10000,m<=100,c<=10000,K<=10000000 题解 我们先随意指定一个根rt,将这棵树转化成有根树 不难发现树上的路径分为两类, 经过根节点rt的路径 和包 含于rt的某棵子树里(不经过rt)的 对于前者, 我们用 $dis[u]$ 表示结点 $u$ 到根节点 $rt$ 的路径长度, 则u到v的路径长即为 $dis[u]+dis[v]$ 对于后者, 既然 $u$ 到 $v$ 的路径包含在 $rt$ 的某个子树内, 那么我们就 找到这棵子树的根,再对他求一次第一类路径 这样分治的思想就很明显了 就是把原来的树分成很多小的子树,并对每个子树分别求解第一类路径 点分治过程中,每一层的所有递归过程合计对每个点处理一次, 假设共递归T层,则总时间复杂度为 $O(T*N)$ 然而,