题意
给定一个长度为 $n$ 的序列 $a$,求 $a$ 中的所有逆序对 $(i_1, j_1), (i_2, j_2), cdots, (i_m, j_m)$ 的一个排列 $p$, 使得依次交换 $(a_{i_{p_1}}, a_{j_{p_1}}), (a_{i_{p_2}}, a_{j_{p_2}}), cdots, (a_{i_{p_m}}, a_{j_{p_m}})$ 后序列单调不降。
$1 le n le 10^3$,$1 le a_i le 10^9$。
题解
前情提要 link1 link2 他帮忙证了证 有可能更详细(
有一位好鸽鸽告诉我证法了!orz jiangly。(但复杂度不太对。
方法一
大家普遍的写法。先考虑 $a_i$ 为 $n$ 排列的情况。
设 $p=a^{-1}$ ,那么 $p_i$ 表示在 $a$ 中为 $i$ 出现的位置。
可以发现 $p$ 与 $a$ 的逆序对是一一对应的,实质上是 $a$ 的下标与 $p$ 的元素构成双射。
证明也十分简单,若 $p_i>p_j,i<j$ ,由于 $a_{p_i}=i,a_{p_j}=j$ ,那么在 $a$ 中 $(i,j)$ 构成了逆序对,同理可得无法构成逆序对。
那么 $p$ 与 $a$ 之间的关系构成了一个双射。
由于题意是对于 $a$ 的下标交换,那么即为对 $p$ 的元素交换,而当 $a$ 为 $[1,2,...,n]$ 后 $p$ 即为 $[1,2,3,...,n]$ 。
则对 $p$ 进行冒泡变为 $[1,2,3...,n]$ 即可解决问题。
若 $a_i$ 不为 $n$ 的排列那么离散化一下,并且相同的钦定下标小的小即可。
复杂度 $mathcal O(n^2)$ 。
方法二
再次 %jiangly 。
前情提要的做法本质上和方法一类似,可以发现最后 $id$ 相当于 $a^{-1}$ 。
那么毛估估一下就可以得到其实就是方法一倒过来并且跑的还慢的做法。
事实上就是将方法一的做法倒过来,并且改成冒泡排序就一模一样啦。
时间复杂度 $mathcal O(n^3)$ ,别问为啥跑过去了。