#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
typedef long long ll;
const int maxn = 505050;
int a[maxn], n, b[maxn];
ll res = 0;
void merge_union(int l, int mid, int r)
{
int low = l, high = mid + 1, i = l;
while(low <= mid && high <= r) {
if(a[low] <= a[high]) {
b[i ++] = a[low++];
} else {
res += mid - low + 1;//count
b[i ++] = a[high++];
}
}
while(low <= mid) b[i++] = a[low++];
while(high <= r) b[i++] = a[high++];
for(int j = l;j <= r;j ++) a[j] = b[j];
}
void merge_split(int l, int r)
{
if(l < r) {
int mid = (l + r) >> 1;
merge_split(l, mid);
merge_split(mid+1, r);
merge_union(l, mid, r);
}
}
int main()
{
while(scanf("%d", &n) && n) {
res = 0;
for(int i = 1;i <= n;i ++) scanf("%d", &a[i]);
merge_split(1, n);
printf("%lld\n", res);
}
return 0;
}
归并求逆序对POJ2299
最新推荐文章于 2020-04-22 23:43:41 发布