P5374 [THUPC2019]不用找的树

· · 题解

首先你要会树分块,这种树分块满足每个块都是一个连通块,且每个块只有最多两个节点与其他块相连,更多内容不赘述,可以看我的博客。

一个邻域可以被拆分成不同块内的 O(B) 个邻域,其中只有 O(1) 个邻域的中心不是界点。

先对每个块单独处理,只考虑同一块内的两个邻域的贡献,分两种情况。

在考虑不同块之间的贡献,对于两个不相交的邻域,有一个求出答案的方法,找到一个点使得从两个邻域中各选一个点路径必定经过这个点。只要求出每个邻域所有点到这个点的距离和点的个数,称为 d_i,c_i,则答案为 d_0c_1+d_1c_0。对每个询问每个块求出邻域在这个块内点的个数和到两个界点的距离和,在收缩树上按照这个式子 dp 一下子就完事了。

时间复杂度 O((n+m)\sqrt n),空间复杂度 O(n+m)

代码就不放了,需要的可以找我要。