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\) 一定无用,原因显然。
维护栈同时,用桶维护颜色的信息,这是简单的。
看题解时很疑惑为什么是这样维护栈,这样维护的难道不是空的吗。
但是空的说明就是没有,结合上述,弹出的显然对后面没有影响。
如果能意识到无后效性,也就没有那么多疑惑了吧。
浙公网安备 33010602011771号