??
题意:求树上距离小于等于K的点对有多少个。
思路:这道题很容易想到树分治,对于当前的根节点来说,任意两个结点之间要么过根结点,要么在一棵子树中。
那么我们dfs一次求出所有点到根结点的距离,然后用o(n)的时间判定有多少节点对符合,(判断方法稍后说)
但是这样有很多在一颗子树中的节点对我们会求重复,我们需要减去在一棵子树中结点对小于等于k的数量,也就是说,我们这一步求的是在不同子树中距离小于等于k的节点对的个数。
接下来说判定方法,将每个点到根结点的距离排序,用两个指针指向队首和队尾,当结点距离和大于k时,队尾指针减一
否则更新答案并将队首指针加一。
这道题还有一个问题样例相当好,因为假如树退化成一条链时,如果我们以任意结点为根那么递归深度将达到O(n),将会tle
所以每次树分治时我们都要找到当前树的重心,并以重心为根继续分治。
?
#include
#include
#include
#include
#include
#include
#include
#include