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数据类型

 

posted @ 2015-09-18 15:00  ZimSion.li  阅读(188)  评论(0编辑  收藏  举报