借助归并排序的思想,时间复杂度为O(logn)
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long a[N],temp[N];
long long ans;
void merge_sort(long long a[],int l,int r){
if(l>=r)return ;
int mid=(l+r)>>1;
merge_sort(a,l,mid),merge_sort(a,mid+1,r);
int i=l,j=mid+1,k=0;
int s=0;
while(i<=mid&&j<=r){
if(a[i]>a[j]){
temp[k++]=a[j++];
++s;
}else {
temp[k++]=a[i++];
ans+=s;
}
}
while(i<=mid){
temp[k++]=a[i++];
ans+=s;
}
while(j<=r)temp[k++]=a[j++];
for(i=l,j=0;i<=r;i++,j++)a[i]=temp[j];
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
merge_sort(a,0,n-1);
cout<<ans<<endl;
return 0;
}