题解:P11967 [GESP202503 八级] 割裂
更好的阅读体验
考场上花费了
题意概述
给定一棵
- 对于每个好点对,两个端点仍然连通(即删除节点不在它们之间的路径上)。
- 对于坏点对,删除节点必须位于它们之间的路径上(否则删除后坏点对仍然连通)。
于是问题转化为:统计那些既落在坏点对路径上、又不落在任何好点对关键路径上的节点。
Solution
不难想到利用 Tarjan 离线 LCA 一次性求出所有点对的最近公共祖先,再结合树上差分的方法更新好点对信息,同时标记坏点对路径上的节点,最终统计满足条件的节点。
具体地,对于每个好点对
使用 DFS 遍历树,在 DFS 中利用并查集维护当前节点的祖先信息:
- 每访问到一个节点,就将其初始化为自己的祖先。
- 遍历完子节点后,通过并查集合并子节点,并将父节点更新为该节点的祖先。
- 对于每个查询,当另一端已经被访问时,即可通过并查集找到当前二者的 LCA。
对于每个好点对
- 在
u 与v 上各加1 , - 在
L (二者 LCA)上减1 , - 在
L 的父节点上再减1 (避免重复扣除)。
最后利用后序遍历(或按深度从大到小累加)将这些差分值向上传递,得到每个节点被“好点对路径”覆盖的次数。
不难发现,只有差分值为
利用坏点对
时间复杂度
link