归并排序求逆序对即可.
附ac代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 500010;
int a[maxn],t[maxn];
ll ans = 0;
void merge(int ll, int rr)
{
// 用来把 a[ll.. rr - 1] 这一区间的数排序.
if (rr - ll <= 1) return;
int mid = ll + ((rr - ll) >> 1);
merge(ll, mid);
merge(mid, rr);
int p = ll, q = mid, s = ll;
while (s < rr)
{
if (p >= mid || (q < rr && a[p] > a[q]))
{
t[s++] = a[q++];
ans += mid - p;
}
else
t[s++] = a[p++];
}
for (int i = ll; i < rr; ++i) a[i] = t[i];
}
int main(int argc, char const *argv[])
{
ll n;
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> a[i];
}
merge(0, n);
cout << ans << endl;
return 0;
}