ARC156F Make Same Set 解题报告
题意:
给定长度为 \(N\) 的序列 \(A,B,C\)。
构造最大的集合 \(S\),满足:
- 对每个 \(j\),在 \(A_j\) 与 \(B_j\) 中选择其一,能得到集合 \(S\)。
- 对每个 \(j\),在 \(A_j\) 与 \(C_j\) 中选择其一,能得到集合 \(S\)。
\(N \le 5000\)
很神奇的题。
假设第一种操作得到了集合 \(S_1\),第二种操作得到了集合 \(S_2\),自然而然地,我们先来考虑最大化 \(|S_1 \cup S_2|\)。
可以看作是 \((A_i,B_i)\) 和 \((A_j,C_j)\) 的匹配,经典网络流。
具体来说,把每组 \((A_i,B_i)\) 看作一个点,再把每个元素看作一个点,然后 \((A_i,B_i) \to A_i, (A_i,B_i) \to B_i\)。另外一侧类似。
唯一的问题是,如果对一个 \((A_i,B_i)\),不仅 \(A_i\) 没有流量,\(B_i\) 也没有流量,就会导致第一种操作会选一个没用的元素导致不合法,称这种情况为退化。暂且不管退化,跑一个流出来,记答案为 \(V\)。
\((A_i,B_i),(A_i,C_i)\) 的形式暗示我们,答案可以取到 \(V\)。
先假装所有的匹配都在 \(A\) 上,然后我们逐步改进这个答案。事实上,如果我们每次找一条距离最小的流更新,总不会出现退化。
如果出现了退化,例如是 \((A_i,B_i)\) 退化了,那一定是从 \(A_i\) 或者 \(B_i\) 退流了。但是由于 \((A_i,B_i)\) 退化了,所以这个点肯定没有流,那可以改为直接从 \(i\) 走而不退流。
直接跑 dinic,复杂度 \(O(n\sqrt n)\)。
感受一下,其实想要让 \((A_i,B_i)\) 退化反而是比较困难的事。如果我们预先解决好了退化的问题,再考虑最大化答案,或许对解题有帮助。