求逆序数对
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX = 5e5 + 5;
int arr[MAX], tmp[MAX];
__int64 res;
void merge_sort(int* arr, int* tmp, int l, int r)
{
if (l == r)
return ;
int m = (l + r) >> 1;
merge_sort(arr, tmp, l, m);
merge_sort(arr, tmp, m + 1, r);
for (int i = l; i <= r; ++i)
tmp[i] = arr[i];
int i1 = l, i2 = m + 1;
for (int curr = l; curr <= r; ++curr)
{
if (i1 == m + 1)
arr[curr] = tmp[i2++];
else if (i2 > r)
arr[curr] = tmp[i1++];
else if (tmp[i1] <= tmp[i2])
arr[curr] = tmp[i1++];
else
{
res += (m - i1 + 1);
arr[curr] = tmp[i2++];
}
}
}
int main()
{
int n;
while (scanf("%d", &n))
{
res = 0;
if (n == 0)
break;
for (int i = 0; i != n; ++i)
scanf("%d", &arr[i]);
merge_sort(arr, tmp, 0, n - 1);
printf("%I64d\n", res);
}
return 0;
}