#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
int n;
int a[100001],pos[100001];
long long merge(int l,int m,int r){
int tl=l,tr=m+1,tt=l;
long long sum=0;
while((tl<=m)&&(tr<=r)){
if(a[tl]<a[tr]){
pos[tt]=a[tl];
tl++; tt++;
} else {
sum+=m-tl+1;
pos[tt]=a[tr];
tr++; tt++;
}
}
while(tl<=m){
pos[tt]=a[tl];
tl++; tt++;
}
while(tr<=r){
pos[tt]=a[tr];
tr++; tt++;
}
for(int ti=l;ti<=r;ti++) a[ti]=pos[ti];
return sum;
}
long long work(int l,int r){
int mid=(l+r)>>1;
long long sum=0;
if(l<mid) sum+=work(l,mid);
if(r>mid+1) sum+=work(mid+1,r);
sum+=merge(l,mid,r);
return sum;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
printf("%lld",work(1,n));
return 0;
}
归并排序处理逆序对问题
最新推荐文章于 2022-02-22 17:24:41 发布