49 lines
1.0 KiB
C++
49 lines
1.0 KiB
C++
#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;
|
||
} |