求一个排列至少两两交换几次,才能使排列有序,也就是求排列中的逆序对的个数。
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
long long n, arr[500000], ans, temp[500000];
void Mergesort(int begin, int end)
{
if (begin == end) return;
int mid = (begin + end) / 2;
Mergesort(begin, mid);
Mergesort(mid + 1, end);
int i = begin, j = mid + 1, k = begin;
while (i <= mid && j <= end)
{
if (arr[i] <= arr[j]) temp[k++] = arr[i++];
else
{
temp[k++] = arr[j++];
ans += mid - i + 1;
}
}
while (i <= mid) temp[k++] = arr[i++];
while (j <= end) temp[k++] = arr[j++];
for (int i = begin; i <= end; ++i)
arr[i] = temp[i];
}
int main()
{
cin >> n;
for (int i = 0; i < n; ++i)
cin >> arr[i];
Mergesort(0, n - 1);
cout<<ans<<endl;
return 0;
}