用归并排序来求
分为左右两部分 分别排序, 然后进行归并的时候 从左右进行比较 当a[j] < a[i] 时候 那么 它所贡献的对数为 mid - i + 1 ------- 因为左右半侧都是有序的 所以 左边的 i ----- mid 是升序 如果 a[i] > a[j]
那么 a[i] --- a[mid] 都大于 a[j] 那么 逆序对数 增加 mid - i + 1 个
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MX = 500010;
ll ans;
int a[MX];
int b[MX];
void merge_sort(int l, int r)
{
if(l >= r) return;
int mid = (l + r) / 2, i = l, j = mid+1, k = l;
merge_sort(l, mid);
merge_sort(mid+1, r);
while(i <= mid && j <= r)
{
if(a[i] <= a[j])
{
b[k++] = a[i++];
}
else
{
ans += mid - i + 1;
b[k++] = a[j++];
}
}
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()
{
int n; scanf("%d", &n);
for(int i =1 ;i <= n; i++)
{
scanf("%d",&a[i]);
}
merge_sort(1, n);
printf("%lld", ans);
return 0;
}