首先容易证明,若干个树上邻域的交要么为空,要么是以顶点或边中点为中心的邻域。如果把边中点建出来,则只需考虑以顶点为中心。求交可以用树链剖分或者倍增在 $O(\log n)$ 时间内完成。
对于询问,求出每个前缀和后缀的交,然后可以通过求一个前缀和一个后缀的交求出去掉某一个邻域之后其他 $k-1$ 个邻域的交。这些交的并的点数就是答案。首先分别计算每个交的大小并求和,然后如果一个点在所有 $k$ 个邻域的交中,它会被计算 $k$ 次,需要减去 $k-1$ 次。统计树上邻域的点数可以用点分治完成。
总复杂度 $O((n+\sum k)\log n)$。