7.19 “春意烂漫”?

P6118 [JOI 2019 Final] 独特的城市 / Unique Cities

对于城市 \(u\) 来说,独特城市是以 \(u\) 为根的树上深度唯一的节点。找到直径的两端 \(p, q\)。对于城市 \(u\) 来说,独特城市一定在 \(u \rightarrow p\)\(u \rightarrow q\) 的路径上,证明从略。

分别从 \(p, q\) 出发 DFS,统计不同路径上的答案,然后取最大值。考虑如何计算答案。

需要一个栈。先预处理出以起点为根的树上所有节点的深度 \(dep(u)\),所有子树的最长链(链在这里指从根节点到叶子节点的路径)及次长链,\(sub(u)\) 中最长链与次长链的长度分别记为 \(M(u)\)\(S(u)\)

当搜索到节点 \(u\),栈中需要存的是对于节点 \(u\) 的独特城市。假设祖先的独特城市已经处理好,将 \(fa(u)\) 加入栈中,然后弹出没用的节点。对于栈中元素 \(e\),如果 \(dep(u) - dep(e) \le M(u)\),都不是节点 \(u\) 的独特城市,但对于 \(sub(u)\) 子树内的节点,不一定不是独特城市。

注意节点 \(u\) 最长链所在子树 \(sub(L(u))\),其内部节点 \(v\),可能满足 \(M(v) \lt dep(v) - dep(e)\)。这需要先处理 \(sub(v)\) 中的节点。对于 \(v\) 来说,如果 \(dep(u) - dep(e) \le S(u)\)\(e\) 是无用的,因为有距离相同的节点。

而对于 \(sub(u) \backslash sub(L(u))\) 的节点来说,只要 \(dep(u) - dep(e) \le M(u)\)\(e\) 一定无用,原因显然。

维护栈同时,用桶维护颜色的信息,这是简单的。

看题解时很疑惑为什么是这样维护栈,这样维护的难道不是空的吗。

但是空的说明就是没有,结合上述,弹出的显然对后面没有影响。

如果能意识到无后效性,也就没有那么多疑惑了吧。

code

posted @ 2025-07-19 23:42  FRZ_29  阅读(7)  评论(0)    收藏  举报
2025-7-11 11:06:15 TOP-BOTTOM-THEME
Enable/Disable Transition
Copyright © 2023 ~ 2025 FRZ - 1801534592@qq.com
Illustration from たとえ,by Rella