题目描述
有一实数序列A[1]、A[2] 、A[3] 、……A[n-1] 、A[n] (n <= 1000000),若i < j,并且A[i] > A[j],则称A[i]与A[j]构成了一个逆序对,求数列A中逆序对的个数。
例如,5 2 4 6 2 3 2 6,可以组成的逆序对有
(5 2),(5 4),(5 2),(5 3),(5 2),
(4 2),(4 3),(4 2),
(6 2),(6 3),(6 2),
(3 2)
共:12个
输入描述
共两行,第一行有一个正整数n,第二行有n个整数。
输出描述
只有一行为逆序对个数。
输入样例
8
5 2 4 6 2 3 2 6
输出样例
12
#include <iostream>
using namespace std;
#define N 1000010
int a[N];
int r[N];
long long ans;
void msort(int s, int t) {
if (s >= t) return;
int mid = (s+t) / 2;
msort(s, mid);
msort(mid+1, t);
int i = s, j = mid+1, k = s;
while (i <= mid && j <= t) {
if (a[i] <= a[j]) {
r[k] = a[i];
k++;
i++;
}
else {
r[k] = a[j];
k++;
j++;
ans += mid-i+1;
}
}
while (i <= mid) {
r[k] = a[i];
k++;
i++;
}
while (j <= t) {
r[k] = a[j];
k++;
j++;
}
for (int i = s; i <= t; i++)
a[i] = r[i];
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
msort(0, n-1);
cout << ans;
return 0;
}