ABC 436e 题解
首先 AC 代码:https://atcoder.jp/contests/abc436/submissions/71721931
时间看上去比较劣,大概是 IO 使用 read 太慢的缘故。
这篇题解就是为了这些私货而生的。
这个东西赛前恰好做过原题:CF1768D。套路非常类似。
具体而言考虑把排列视作一个置换:
根据函数图的经典结论,我们知道交换一个环上的两个点可以将环分裂,交换不同环的点会将两个环合并到一起。
我们的目标是将原始图变成一堆自环(消除掉所有尺寸大于 1 的环),这样我们发现,肯定在所有操作都是“有用的”的时候总操作次数最少。
也就是说,如果每次操作都将一个环分裂,这样操作次数最少。
那么我们的第一次操作可能是哪些呢?事实上你随便挑一个能够将环分裂的操作都行。
那么答案就随便求了:
然后回到那个结论。我们需要证明:交换同一个环上的两个不同点,环被分裂成两个。而交换不同环上的两个点,两个环合并。
考虑
那么,就变成了
对于