牛逼题

给你一棵带边权树和一个初始为空的点集 \(S\),每次在 \(S\) 中加入一个点,一共加 \(n\) 次。每次加点后需要你求出删去边权值的最小值使得所有 \(S\) 中的点互不联通。

\(n \le 5\times 10^{6}\)\(\text{1.5s, 1024MB}\)

考虑一条边什么时候才会被删掉。在加点的过程中,若两个点集中的点联通了,那么就需要断开它们简单路径中的一条边,我们不妨贪心地考虑,直接删掉最小的那个。

这样其实是对的。

下面我们考虑加入这个点之前的点集情况。首先,加入一个点之后,它最多只会与一个当前点集里面的点联通,这是因为联通的传递性,如果同时联通了两个点,那么那两个点也联通,这不符合前面加点的合法性。

此外,对于这个点,必然会与一个当前点集中的点联通。我们考虑使用归纳法在集合大小大于 \(2\) 时证明这个事情。对于一个以 \(x\) 为根(\(x\) 不在点集中)的最大深度 = 2 的子树,我们忽略不在点集中的儿子,一定存在一个儿子与 \(x\) 联通,这是因为如果所有儿子都不与 \(x\) 联通,此时我们必然可以随便抽一个儿子和 \(x\) 联通,由于边权非负,此时仍然合法,且代价变小,矛盾,因此一定存在一个儿子与 \(x\) 联通。另外,如果有 \(>1\) 个儿子与 \(x\) 联通也不行,因为它们会通过 \(x\) 联通使得不合法,因此有且仅有一个儿子与 \(x\) 联通。

我们再来考虑以 \(x\) 为根(不在点集中)的最大深度 \(>1\) 的普遍情况,对于所有没有点集中的点的子树,我们忽略。对于所有不为点集中的点的儿子,因为它没有被忽略,因此它的子树中一定还有其它点,所以深度 \(>1\)。由于在做归纳法,且已证底,因此我们可以假设它子树中一定存在点与它联通。如果对于 \(x\),每个儿子到它的边都被删除了,我们一定可以去掉一个被删除的边,此时同样合法且答案更小,因此对于这个点,必然会与一个当前点集中的点联通。

在此基础上,我们来说明不断每次删掉路径中最小的边是正确的。依然考虑归纳,对于两个点的时候,显然删掉最小的边最优。对于 \(k>2\) 个点的时候,我们假设前面的答案是 \(a_1\),点集为 \(S\),此时再加入一个点 \(p\)。对于答案为 \(a_1\) 的删边情况 \(E_1\),我们在此基础上进行操作,显然也是删掉最小的边最优,因此我们考虑有否存在另一个删边情况 \(E_2\),它加入点 \(p\) 之前答案是 \(a_2\),使得在此基础上操作能够得到的答案更小。

假设 \(E_1\) 中,与 \(p\) 联通的点为 \(x\),在 \(E_2\) 中,与 \(p\) 联通的点为 \(y\)。首先 \(x\) 一定不等于 \(y\),因为如果等于,那么此时 \(p\)\(x\) 的最小值等于 \(p\)\(y\) 的最小值,又由于 \(a_1<a_2\),所以 \(E_2\) 一定不优。接下来我们考虑 \(x\ne y\) 的情况。

草拟吗要用拟阵。证不下去了,反正是对的。

posted @ 2026-07-16 16:01  PM_pro  阅读(4)  评论(0)    收藏  举报