1 条题解
-
0
自动搬运
来自洛谷,原作者为

RyexAwl
人生有梦,各自精彩搬运于
2025-08-24 22:17:36,当前版本为作者最后更新于2022-02-21 13:18:08,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
首先,定义“点 对点 有贡献”等价于 是 的独特的城市。
钦定点 为根,令点集 表示到所有到点 距离最远的叶子节点构成的集合,对点 有贡献的点一定在 中所有点到 的路径的交上。

注意,路径交上的所有点并不都一定对 有贡献。
因此一个想法就是考虑找到随便一个点 距离点 最远,考察 两点间的路径上的点。
而考虑离点 最远的点,可以选一条直径 , 两个点中一定存在一个点是距离点 最远的点。
进而问题就转化成了:给定一个点 ,以 为根,求出每个点 到 路径上所有对点 有贡献的点的颜色数。
分别以 为 求一遍上面的问题即可。
接下来考虑如何去求解上面转化后的问题。
考虑一个在点 到根节点路径上的点 不会对点 产生贡献的充分必要条件:存在一个点 使得 与 的距离等于 与 的距离,按照点 的位置分类讨论:
-
在 子树内。
-
在 子树外。
考虑维护出一个点集 , 满足:
-
在根节点到 的路径上。
-
不存在一个点 在 的子树外,使得 。

同时考虑点集 , 满足:
-
在根节点到 的路径上。
-
不存在一个点 ,使得 。
并且 ,删掉 中所有满足存在一个点 在 子树内,使得 的点 即可将 “变成” 。
考虑 的一个儿子 ,想要构造出 ,需要对 进行哪些 “改造”(或者说点集如何变化)。
的子树外等价于 的子树外并上 的兄弟子树
-
先令 。
-
删掉 中所有满足存在一个点 满足 属于 的兄弟的子树中, 的点 。
而 “删掉 中所有满足存在一个点 满足 属于 的兄弟的子树中, 的点 ”,可以转化成 “删掉 中所有 的点 。
考虑对该树做长链剖分,令点 的长儿子为 , 表示 子树内距离 距离最远的点与 的距离, 表示 的次长儿子,。
注意到,对于 的所有非长儿子,在点集 中要删除的点集都一样。
而对于点 的长儿子,要删除的点集为 中所有满足 的点 。
考虑在 DFS 的过程中维护点集 ,在进入子树 前,全局维护的信息应为 的信息。
进入子树 后依次进行以下操作:
-
删除当前全局维护的点集中所有满足 的点 。
-
在当前全局维护的点集中加入点 。
-
递归长子树。
-
删掉当前全局维护的点集中所有满足 ,当前全局维护的点集为 ,同时也是对于任意轻儿子 的 。
-
依次递归轻子树,其中在递归轻子树前需要将点 加入全局维护的点集中。
-
如果点 在全局维护的点集中,删除点 。
这样操作的合法性:
在递归长子树时,在长子树内进行的 “删除操作”影响到的 的祖先,至多影响到 的 级祖先,而这些点在处理轻子树之前本来就需要被删除。
而在递归非长子树 时,只会至多影响 的 级祖先,而这些祖先一定都被删光光了,因此在处理轻子树时一定不会影响到集合中 的祖先。
这样,一个元素至多贡献儿子个数次总复杂的为 。
-
- 1
信息
- ID
- 5134
- 时间
- 2000ms
- 内存
- 250MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者