#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
#define M 500010
#define MAX 900000000
int a[M];
int left[M],right[M];
int n;
ll ans;
void read()
{
int i;
for(i=0;i<n;i++)
{
scanf("%d",a+i);
}
}
void merge(int ar[],int l,int m,int r)
{
int n1=m-l+1;
int n2=r-m;
int i,j,k;
for(i=0;i<n1;i++)
{
left[i]=ar[l+i];
}
for(i=0;i<n2;i++)
{
right[i]=ar[m+i+1];
}
left[n1]=right[n2]=MAX;
i=j=0;
for(k=l;k<=r;k++)
{
if(left[i]<right[j])
{
ar[k]=left[i++];
}
else
{
ar[k]=right[j++];
ans+=n1-i;
}
}
}
void mergesort(int ar[],int l,int r)
{
if(l<r)
{
int m=(l+r)/2;
mergesort(ar,l,m);
mergesort(ar,m+1,r);
merge(ar,l,m,r);
}
}
void cal()
{
ans=0;
mergesort(a,0,n-1);
}
void answer()
{
printf("%lld\n",ans);
}
int main()
{
while(~scanf("%d",&n),n)
{
read();
cal();
answer();
}
}
POJ 2299 归并排序
最新推荐文章于 2024-08-17 03:34:20 发布