POJ2299 求逆序对总数 归并算法解决

逆序对 比如 3 2 1  

3之前的数没有比它大的(或者说前面没有数了),所以没有逆序对

2之前的数有3比它大 所以有逆序对+1

1之前的数有 3 2 比它大 所以有逆序对+2

所以 3 2 1 序列 的 总的逆序对为3对

-----

在归并算法中 合并两个已经排序好的序列时 是从两个序列的首个位置开始进行比较

合并方法传入的参数为:first mid(分界下标) last

第一个序列下标:first ~ mid

第二个序列下标:mid + 1 ~ last

1.如果a[i] <= a[j]  显然 不存在 逆序对

2.如果a[i]>a[j] 显然 存在逆序对,此时,既然a[i]>a[j] 那么i后面的下标(i+1~mid)对应的数a[i]也绝对大于a[j] 所以存在逆序对(mid - i + 1)(包括a[i]在内的数以及后面的数都大于a[j],逆序对就为mid-i+1对)

经过归并排序之后,累加的逆序对数就是整个序列的总的逆序对数 即 答案

【注意】

由于输入的序列长度最大为500000 且每个数可达到999999999,所以累加逆序对数的变量最好用long long数据类型

 

转载于:https://www.cnblogs.com/ZimSionLi/p/4819235.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值