CF1559D1&D2 Mocha and Diana

发布时间 2023-09-11 22:05:38作者: FOX_konata

原题(Eazy Version)

原题(Hard Version)

翻译

首先我们先考虑Eazy Version。容易发现,在\(A,B\)两个森林中一定有一个是一棵树。这个结论说明:

  1. 选边顺序没影响

  2. 能选就选

因此我们枚举\(n^2\)条边,用并查集判断连通性即可

最终复杂度\(O(n^2 \alpha(n))\)\(O(n^2logn)\)


然后我们考虑Hard Version怎么做。我们发现上面的做法我们多判断了很多条边。例如我们连接了\((x,y)\),则我们还会继续判断\((x,z)\),其中\(z\)\(x\)在同一个连通块里。这是很不优的。因此我们考虑优化

首先我们先枚举连接所有能连接的边\((1,u)\),此时点分成了三类:

  1. \(1\)\(A\)图中和\(u\)联通,在\(B\)图中和\(u\)联通

  2. \(1\)\(A\)图中和\(u\)联通,在\(B\)图中和\(u\)不联通

  3. \(1\)\(A\)图中和\(u\)不联通,在\(B\)图中和\(u\)联通

我们把第二类节点和第三类节点分别划分在集合\(L\)\(R\)中,容易发现\(L \cap R = \emptyset\),并且在\(L\)\(R\)内的所有节点都是可匹配的。因为如果在\(L\)中有\(x\)\(R\)\(y\)不匹配,则说明在\(A\)图或\(B\)图中\(x,y\)在同一连通块内,因此\(x,y\)应该在同一集合中,假设不成立。

因此我们接下来的策略就是在\(L\)\(R\)中随便选两个点\(x,y\),连边,把\(L\)\(R\)中联通的点删去,并重复此操作直到\(L\)\(R\)之一为空

最终复杂度\(O(n \alpha(n))\)\(O(n \log n)\)