最小相邻交换与逆序对
给定一个排列 T T T,给定另外一个排列 T ′ T' T′,其中两个排列中的元素相同,问只能交换相邻元素,最小的交换步骤是多少,使得两个排列的元素位置相同。
不同元素
如果两个排列元素不存在相同元素,那么我们可以给排列 T T T,重新标号为 1 , 2 , … , n 1,2,\ldots,n 1,2,…,n的一个排列,变成一个映射,那么 T ′ T' T′也对应着另外一个排列,那么最小的交换数为 T ′ T' T′对应着另外一个排列的逆序对数。
证明:
我们可以通过 num \textit{num} num 包含的「逆序对」的数量来得到最少的交换次数。在每一次交换操作中,设我们交换的是 num [ i ] \textit{num}[i] num[i] 和 num [ i + 1 ] \textit{num}[i+1] num[i+1]:
- 如果 num [ i ] < num [ i + 1 ] \textit{num}[i] < \textit{num}[i+1] num[i]<num[i+1],那么 num \textit{num} num 包含的逆序对数量会增加 1 1 1;
- 如果 num [ i ] > num [ i + 1 ] \textit{num}[i] > \textit{num}[i+1] num[i]>num[i+1],那么 num \textit{num} num包含的逆序对数量会减少 1 1 1。
由于逆序对为 0 0 0的排列是唯一的,即自然排列,因此我们要做的就是将乱序变成自然排列,因此任何减少逆序对的操作都是必要且有意义的,无论两个要交换的元素中间隔了多少个元素。
相同元素
若存在相同元素,按照排序的稳定性标列序号即可,因为相同元素排列不影响逆序对的形成,因此相同元素的相对位置不变,那么逆序对的数量就不会增加,因此按照稳定性标列序号,然后再求逆序对的方法是正确的。
例题
先求第 k k k个排列,然后交换法求还是树状数组求逆序对均可。
不要被题面中两个序列均可交换所诱惑,因为任何对一个序列的操作都可以转换成对另外一个序列的等价操作,因此即对一个序列进行交换即可。