CF1559 D1&D2 题解

这是 CF1559 D1 & D2 的题解。

先来看看 Easy Version。数据范围:\(1\le n\le 10^3\)


结论:最终态的两片森林中至少有一片是一棵树。

证明:

当第一片森林中只有一棵树时,原命题成立。

于是设第一片森林中至少有两棵树。设其中两棵分别为 \(A\)\(B\),那么 \(\forall a\in A,b\in B\),它们在第一片森林中均不联通。由于是最终态,若它们在第二片森林中仍不连通,则必然能再连边 \((a,b)\),不满足最终态定义。因此 \(\forall a\in A,b\in B\),在第二片森林中 \(a\)\(b\) 必然连通。从而 \(A\)\(B\) 在第二片森林中属于同一棵树。同理可得第一片森林中所有的树在第二片中都属于同一棵树,即第二篇森林中只有一棵树。从而原命题成立。


因此,无论加入合法边顺序不同,甚至加入的合法边都不同,最终加入的边数是相同的,即 \((n-1)-\min(m1,m2)\)

看到 \(1\le n\le 10^3\) 的数据范围,考虑直接枚举两点 \(a\)\(b\),若满足 \(a\ne b\) 且连边前 \(a,b\) 在两片森林都不连通,那我们就连上这条边。这种策略是在上述结论下得出的,因此是正确的。使用带路径压缩和按秩合并的并查集,时间复杂度为 \(O(n^2\alpha(n))\)

具体代码实现

再来看看 Hard Version。数据范围:\(1\le n\le 10^5\)

考虑优化贪心。根据上面的结论,我们可以先找一个中心点 \(s\),然后尝试将所有点与其连边。然后设第一片森林为 \(A\),第二片森林为 \(B\)。设 \(A\) 中不与 \(s\) 连通的点集为 \(P\)\(B\) 中不与 \(s\) 连通的点集为 \(Q\)\(\forall a\in P\)\(s\)\(a\) 不能连边的原因是因为 \(s\)\(a\)\(B\) 中已经连通。同理 \(\forall b\in Q\)\(s\)\(b\)\(A\) 中已经连通。因此 \(P\cap Q=\varnothing\)。注意到此时 \(a\)\(b\) 已经满足连边条件,我们只需再满足连边前 \(a,b\) 在两片森林都不连通即可。使用带路径压缩和按秩合并的并查集,时间复杂度近似为 \(O(n+m)\)

具体代码实现

当然,官方题解的解法也是值得借鉴的,其中没有使用按秩合并,时间复杂度为 \(O(n\log^2n)\),在这里就挂出 链接

本篇题解参考了 lijunhan 的 CF1599D1 题解Macesuted 的 CF1599D2 题解

posted @ 2021-08-21 10:47  cyl06  阅读(37)  评论(0编辑  收藏  举报