关键是cnt+=m-p
其余和归并排序一模一样。
#include<cstdio>
#include<iostream>#include<cstring>
using namespace std;
int a[111111],t[111111],n,cnt;
void merge(int *A,int x,int y,int *T)
{
if (y-x>1)
{
int m=x+(y-x)/2;
int p=x,q=m,i=x;
merge(A,x,m,T);
merge(A,m,y,T);
while (p<m||q<y)
{
if (q>=y||(p<m&&A[p]<=A[q])) T[i++]=A[p++];
else T[i++]=A[q++],cnt+=m-p;
}
for (int i=x;i<y;i++) A[i]=T[i];
}
}
int main()
{
scanf("%d",&n);cnt=0;
memset(a,0,sizeof(a));
memset(t,0,sizeof(t));
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
merge(a,1,n+1,t);
for (int i=1;i<=n;i++) printf("%d ",a[i]);
printf("%d",cnt);
}