【题解】CF1553E Permutation Shift 置换、循环分解、鸽巢原理

题目链接

前置问题:

给定两个长度为 \(n\) 的排列 \(\pi_1,\pi_2\) ,每次可以交换排列 \(\pi_1\) 的任意两个元素,最少交换多少次使得,\(\forall i,\pi_1(i)=\pi_2(i)\)

考虑置换 :

\[\left(\begin{array}{l} \pi_{1}(1), \pi_{1}(2), \pi_{1}(3), ... ,\pi_{1}(n)\\ \pi_{2}(1), \pi_{2}(2), \pi_{2}(3), ...,\pi_{2}(n) \end{array}\right) \]

考虑分解出来的环。我们的目标即让该置换的环的数量恰好是 \(n\)

考虑交换两个元素对环个数的影响:

  • 在同一个环中交换元素会减少一个环。

  • 在两个不相交的环中交换元素会产生一个更长的环。

  • 所需的置换数为 \(n-c\),其中 \(c\) 是分解中的循环数。

那么回到本题,一个暴力的做法即枚举 \(k\) ,每次 \(O(n)\) \(\text{check}\)

优化的方向有两个,一个是改变每次 \(\text{check}\) 的算法,另一种是排除不可能的答案使得 \(\text{check}\) 常数次。

考虑 \(m\le \dfrac{n}{3}\) 的性质。

\(cnt_i\) 为排列 \(1,2,3,...n\) “循环移位” \(i\) 位后 \(\pi_1(j)=\pi_2(j)\) 的位置个数。

因为每次至多改变 \(2\times m\) 个位置。

\(k\) 合法的必要条件为 \(cnt_k\ge n - 2\times m \ge \dfrac{n}{3}\)

因为对于每一位使得 \(\pi_1(j)=\pi_2(j)\) 的循环移位位数唯一,所以 \(\sum cnt_i = n\) ,因此合法的 \(k\) 不超过 \(3\) ,每次暴力做就行了。

代码记录

posted @ 2021-09-30 17:37  Themaxmaxmax  阅读(47)  评论(0编辑  收藏  举报