(按序列b的顺序给a排序)
题目描述
涵涵有两盒火柴,每盒装有
n 根火柴,每根火柴都有一个高度。
现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:
其中 a i a_i ai 表示第一列火柴中第 i 个火柴的高度, b i b_i bi 表示第二列火柴中第i 个火柴的高度。
每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?
算法简述
根据排序不等式易知,同序距离最大,那么就转换成了序列a的顺序变为序列b的顺序需要多少次交换
我们需要知道两个信息,a[i]在序列a中是第x小的,在序列b中,第x小的数j是多少,设两个辅助数组
rnk1[i]=x表示a[i]是第x小的,rnk2[x]=j表示第x小的的数下标是j
我们可以将这两个数组合并,rnk[i]=j表示a[i]应该在第j个位置,那么对a[i]从小到大归并排序,就记录逆序对的个数,就可以求出交换次数,或者用树状数组求解
·
当rnk变为1,2,3,4……n,a[1]应该在第一个位置…a[n]应该在第n个位置,也就不需要交换了,序列a,b已经同序