Files
python/GESP/Level6/20230902.cpp

49 lines
1.0 KiB
C++
Raw Normal View History

2025-08-30 18:35:01 +08:00
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3e5 + 10;
int n;
int q[N];
int t[N];
LL ans;
/*
6
0 1 2 3 4 5
答案:15
*/
// 归并排序,附带求顺序对的数量
void merge_sort(int q[], int l, int r) {
if (l >= r)
return;
int mid = (l + r) >> 1;
merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
int i = l;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= r)
if (q[i] <= q[j]) {
t[k++] = q[i++];
// 顺序对,原理:当q[i]<=q[j]时,q[i]与q[j]之后的所有数都构成顺序对
ans += r - j + 1;
} else
t[k++] = q[j++];
while (i <= mid)
t[k++] = q[i++];
while (j <= r)
t[k++] = q[j++];
for (i = l, j = 0; i <= r; i++, j++)
q[i] = t[j];
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> q[i];
// 根据题目提示,使用归并排序,并在归并排序的过程中计算顺序对的数量
merge_sort(q, 1, n);
printf("%lld", ans);
return 0;
}