P1966火柴排队(线段树,树状数组,归并排序)

(按序列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已经同序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值