hackerzwh 2013-01-29 08:49:00
点我顶贴
收藏
删除
#include<cstdio>
const int MAXN=20000+100;
int A[MAXN],T[MAXN];
int n,cnt;
void merge_sort(int* A,int x,int y,int* T)
{
if(y-x<=1)return;
int m=x+(y-x)/2;
merge_sort(A,x,m,T);
merge_sort(A,m,y,T);
int k=x,p=x,q=m;
while(p<m||q<y)
{
if(q>=y||(p<m&&A[p]<=A[q]))T[k++]=A[p++];
else
{
T[k++]=A[q++];
cnt+=m-p;//归并排序到此,左边还没来得及复制到T的那些数就是左边所以比A[q]大的数.加上左边元素个数m-p.
}
}
for(int i=x;i<y;i++)
A[i]=T[i];
}
int main()
{
//freopen("fish.in","r",stdin);
//freopen("fish.out","w",stdout);
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&A[i]);
merge_sort(A,0,n,T);
//for(int i=0;i<n;i++)printf("%d ",A[i]);
printf("%d\n",cnt);
return 0;
}