#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int n, res, K;
int a[N], b[N];
void merge(int l, int r) {
if (l >= r) return;
int mid = l + r >> 1;
merge(l, mid);
merge(mid + 1, r);
int i = l, j = mid + 1, k = l;
while (i <= mid && j <= r) {
if (a[i] <= a[j]) {
b[k++] = a[i++];
} else {
b[k++] = a[j++];
res += mid - i + 1;//统计答案
}
while (i <= mid)b[k++] = a[i++];
while (j <= r)b[k++] = a[j++];
for (int i = l; i <= r; i++) {
a[i] = b[i];
}
}
}
int main() {
ios::sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
merge(1, n);
cout << res << endl;
return 0;
}
归并排序 · 求逆序对
最新推荐文章于 2024-04-21 03:39:53 发布