ARC156F Make Same Set 解题报告

题意:

给定长度为 \(N\) 的序列 \(A,B,C\)

构造最大的集合 \(S\),满足:

  1. 对每个 \(j\),在 \(A_j\)\(B_j\) 中选择其一,能得到集合 \(S\)
  2. 对每个 \(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)\) 退化反而是比较困难的事。如果我们预先解决好了退化的问题,再考虑最大化答案,或许对解题有帮助。

posted @ 2023-02-26 22:10  一般通过小萌新  阅读(79)  评论(1编辑  收藏  举报