题面(来自acwing):
程序:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int n;
int tmp[N];
int merge_sort(int l,int r){
if(l==r) return 0;
int mid=(l+r)>>1;
int res=merge_sort(l,mid)+merge_sort(mid+1,r);
int i=l,j=mid+1,cnt=0;
//双指针,cnt为计数器
while(i<=mid&&j<=r){
if(a[i]<=a[j]){
tmp[cnt++]=a[i++];
}
if(a[i]>a[j]){
tmp[cnt++]=a[j++];
//此时存在逆序对,i后面的都大于aj
res+=mid-i+1;
}
}
while(i<=mid){
tmp[cnt++]=a[i++];
}
while(j<=r){
tmp[cnt++]=a[j++];
}
for(int i=l,j=0;j<cnt;j++){
a[i++]=tmp[j];
}
return res;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cout<<merge_sort(0,n-1)<<endl;
return 0;
}