采用归并排序的思想
在对两个排好序的区间进行合并时,如果左边区间的数大于右边区间的数那么就出现了逆序对,计算一下从这个数的位置到区间最后还有几个数,这些数都是可以和右区间的数组成逆序对的。然后就看代码吧
#include <iostream>
using namespace std;
const int maxn = 100010;
int arr[maxn];
int nums[maxn];
long long res = 0;
void merge(int l, int mid, int r) {
int p1 = l;
int p2 = mid + 1;
for (int i = l; i <= r; i++) {
if ((p1 <= mid) && ((p2 > r) || arr[p1] <= arr[p2])) {
nums[i] = arr[p1];
p1++;
}
else {
nums[i] = arr[p2];
p2++;
res += mid - p1 + 1;//从这个数的位置到区间最后还有几个数
}
}
for (int i = l; i <= r; i++) {
arr[i] = nums[i];
}
}
void erfen(int l, int r) {
int mid = (l + r) / 2;
if (l < r) {
erfen(l, mid);
erfen(mid + 1, r);
}
merge(l, mid, r);
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
erfen(0, n - 1);
cout << res;
}


京公网安备 11010502036488号