【AGC038F】 Two Permutations

一个排列可以拆成很多个环,我们设 PiP_i 属于的环为 pip_i,QiQ_i 属于的环为 qiq_i。

对于一个环,只有两种选择,拆成若干自环或保留原状。

我们发现情况分为 55 种:

  • Pi=Qi=iP_i=Q_i=i,此时必然 Ai=BiA_i=B_i。
  • Pi=i,Qi≠iP_i=i,Q_i\ne i,当且仅当 qiq_i 被拆分时 Ai=BiA_i=B_i。
  • Pi≠i,Qi=iP_i\ne i,Q_i=i,当且仅当 pip_i 被拆分时 Ai=BiA_i=B_i。
  • Pi≠Qi,Pi≠i,Qi≠iP_i\ne Q_i,P_i\ne i,Q_i\ne i,当且仅当 pip_i 和 qiq_i 都被拆分时 Ai=BiA_i=B_i。
  • Pi=Qi≠iP_i=Q_i\ne i,当且仅当 pip_i 和 qiq_i 都被拆分或都不被拆分时 Ai=BiA_i=B_i。

我们设 pip_i 被拆分时在 SS 集合中,qiq_i 被拆分时在 TT 集合中,建出最小割模型。

  • Pi=Qi=iP_i=Q_i=i,必定耗费 11 代价。
  • Pi=i,Qi≠iP_i=i,Q_i\ne i,qiq_i 在 TT 集合中耗费 11 代价,SS 向 qiq_i 连边权为 11 的边。
  • Pi≠i,Qi=iP_i\ne i,Q_i=i,pip_i 在 SS 集合中耗费 11 代价,pip_i 向 TT 连边权为 11 的边。
  • Pi≠Qi,Pi≠i,Qi≠iP_i\ne Q_i,P_i\ne i,Q_i\ne i,pip_i 在 SS 且 qiq_i 在 TT 耗费 11 代价,pip_i 向 qiq_i 连边权为 11 的边。
  • Pi=Qi≠iP_i=Q_i\ne i,pip_i 和 qiq_i 在不同集合耗费 11 代价,pip_i 和 qiq_i 互连边权为 11 的边。

然后跑最小割即可。 这里简单描述一下最后两种边为什么要这么连,以第四种情况为例,若 SS 能到 pip_i,qiq_i 能到 TT,为了割开集合,就必须断这条边,也就是说只有断掉这条边才有可能 pip_i 在 SS 集合中,qiq_i 在 TT 集合中。

因为是最小割,所以第五种情况的边在任何情况下最多只会割掉一个方向,所以代价是 11,没有问题。

然后是复杂度,由于是二分图单位边权,时间复杂度 O(nn)\mathrm O(n\sqrt n)。

Submission #55948786 - AtCoder Grand Contest 038