题目大意:
多组数据,每组给出 N N 个数,求它们的逆序对。
n<500,000
n
<
500
,
000
0≤a[i]≤999,999,999
0
≤
a
[
i
]
≤
999
,
999
,
999
分析:
直接上归并排序即可。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define N 500005
using namespace std;
typedef long long ll;
int a[N], b[N], n;
ll ans;
void Merge(int l1, int r1, int l2, int r2)
{
int cnt = 0;
while (l1 <= r1 && l2 <= r2)
{
if (a[l1] >= a[l2]) b[++cnt] = a[l2++], ans += r1 - l1 + 1;
else b[++cnt] = a[l1++];
}
while (l1 <= r1) b[++cnt] = a[l1++];
while (l2 <= r2) b[++cnt] = a[l2++];
int j = r2;
for (int i = cnt; i >= 1; i--) a[j--] = b[i];
}
void Merge_sort(int l, int r)
{
if (l >= r) return;
{
int mid = (l + r) >> 1;
Merge_sort(l, mid);
Merge_sort(mid + 1, r);
Merge(l, mid, mid + 1, r);
}
}
int main()
{
while (~scanf("%d", &n))
{
if (!n) break;
ans = 0;
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
Merge_sort(1, n);
printf("%lld\n", ans);
}
return 0;
}