#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=400001;
int n,a[MAXN],b[MAXN];
int ans;
void mergesort(int l,int r)
{
if (l==r) return;
int mid=(l+r)/2;
mergesort(l,mid);
mergesort(mid+1,r);
int i=l,j=mid+1,k=l;
while (i<=mid&&j<=r)
{
if (a[i]<=a[j]) {b[k]=a[i]; k++; i++;}
else {b[k]=a[j]; k++; j++; ans+=mid-i+1;}
}
while (i<=mid) {b[k]=a[i]; i++; k++;}
while (j<=r) {b[k]=a[j]; k++; j++;}
for (int i=l; i<=r; i++)
a[i]=b[i];
}
int main()
{
scanf("%d",&n);
for (int i=1; i<=n; i++) scanf("%d",&a[i]);
mergesort(1,n);
for (int i=1; i<=n; i++) printf("%d ",a[i]);
printf("%d",ans);
return 0;
}
/*
6
5 4 2 6 3 1
*/
归并排序求逆序对
最新推荐文章于 2024-04-21 03:39:53 发布