题目描述:给出n个整数,求其逆序对个数。
数据范围:n<500,000, 整数<999,999,999
分析:使用归并排序求逆序对
/*
PROG: UVa10810
*/
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define MAXN 500010
int a[MAXN], b[MAXN], c[MAXN];
#define DEBUG 1
#define LOG(...) do { if (DEBUG) fprintf(stderr, __VA_ARGS__); } while(0)
typedef long long LL;
LL Merge(int l, int r) {
if (l >= r) return 0;
int m = (l+r) >> 1;
LL ret = Merge(l, m)+Merge(m+1,r);
memcpy(b, a+l, sizeof(int)*(m+1-l));
memcpy(c, a+m+1, sizeof(int)*(r-m));
int i, j;
i = j = 0;
for (int k = l; k <= r; ++k) {
if (i == m+1-l) a[k] = c[j++];
else if (j == r-m) a[k] = b[i++], ret += r-m;
else if (b[i] > c[j]) a[k] = c[j++];
else a[k] = b[i++], ret += j;
}
return ret;
}
int main(void) {
int n;
while (scanf("%d", &n), n) {
for (int i = 0; i < n; ++i)
scanf("%d", a+i);
printf("%lld\n", Merge(0, n-1));
}
return 0;
}