此题是一道排序题,但是数据量大,即使时间长,用冒泡之类的同样会超时,此时接触了,归并排序,用到分治思想。。。
代码:
#include<stdio.h>
#include<string.h>
int num[500002];
int nl[500003];
int nr[500002];
long long t;
void compute(int top,int mid,int end)
{
for(int i=top; i<=mid; i++)
nl[i]=num[i];
nl[mid+1]=0x7ffffff;
for(int i=mid+1; i<=end; i++)
nr[i]=num[i];
nr[end+1]=0x7ffffff;
int p=top;
int q=mid+1;
for(int i=top; i<=end; i++)
if(nl[p]<=nr[q])
{
num[i]=nl[p++];
}
else
{
num[i]=nr[q++];
t+=(mid-p+1);
}
}
void msort(int top,int end)
{
if(top<end)
{
int mid=(top+end)/2;
msort(top,mid);
msort(mid+1,end);
compute(top,mid,end);
}
}
int main()
{
int n;
while(scanf("%d",&n),n)
{
t=0;
for(int i=1; i<=n; i++)
scanf("%d",&num[i]);
msort(1,n);
printf("%lld\n",t);
}
return 0;
}