InsertionSort2

[ARC162B] Insertion Sort 2

本题还是对于不变量的考察,但是比较明显。

首先两个数捆绑插到任意一个位置可以等价为偶数次相邻交换((因为你每次可以这样:比如现在是 a<b<c,a,b,c,你可以交换 a,c,变为 c,b,a,然后交换 ab,变为 c,a,b,这样你就会往后挪动一次,往前同理①)。然后我们知道每次相邻交换可以消去/产生一个逆序对,所以奇偶性会改变,改变偶数次就不变,而最后逆序对为 \(0\),所以如果初始时逆序对数为奇数,一定无解。

然后我们考虑到对于偶数个逆序对的初始序列一定有解。

只需重复以下过程即可:

找到最小的 \(m\),使得 \(P_m \neq m\)。如果不存在这样的 \(m\),则 \(P\) 已经是升序,结束过程。

对于满足 \(P_k = m\)\(k\),如果 \(k<N\),则进行操作 \(i=k\)\(j=m-1\)。(相当于将这个数接到已经排好序的数后面)否则,首先进行操作 \(i=N-1\)\(j=N-3\),然后进行操作 \(i=k\)\(j=m-1\)。(相当于将它移到倒数第二个位置,这样他就可以接,否则中间隔着一个数)

上述过程在 \(m=N-1\) 时可能无法成功(因为最后前面的都排好序,如果这样交换破坏了前面),但是由于逆序对数为偶数这个条件,\(m=N-1\) 是不可能的。(其实到 \(n-2\) 确定完之后 \(n-1,n\) 都不需要了)。此外,通过一次操作,\(m\) 必定会增加至少 1(或 \(P\) 变为升序),因此上述过程最多重复 \(N-2\) 次。

因此,\(P\) 可以始终通过不超过 \(2000\) 次操作排列为升序。

code

对于①研究时可能有用的例子:

[1 4] 5 2 3

5 [1 4] 2 3(5,1;1,4交换)

5 2 [1 4] 3(2,1;1,4交换)

posted @ 2023-06-20 22:09  wscqwq  阅读(24)  评论(0编辑  收藏  举报