#include<bits/stdc++.h>
using namespace std;
long long ans=0;
int a[1000000];
int temp[1000000];
void merge(int a[],int begin,int mid,int end,int temp[]){
int i=begin;
int j=mid+1;
int t=begin;
while(i<=mid && j<=end){
if(a[i] <= a[j]) temp[t++] = a[i++];
else{
temp[t++] = a[j++];
ans+=mid-i+1;
}
}
while(i<=mid) temp[t++] = a[i++];
while(j<=end) temp[t++] = a[j++];
for(int i=begin;i<=end;i++) a[i]=temp[i];
}
void mergesort(int a[],int begin,int end,int temp[]){
if(begin >= end) return;
int mid=(begin+end)/2;
mergesort(a,begin,mid,temp);
mergesort(a,mid+1,end,temp);
merge(a,begin,mid,end,temp);
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
mergesort(a,0,n-1,temp);
cout << ans <<endl;
return 0;
}
逆序对(归并算法)
最新推荐文章于 2023-11-22 18:21:48 发布