题目本质就是求逆序对,然后用归并排序就可以做了,冒泡也能做,但是超时,O(n^2)的算法相比于O(n*log(n))算法总是要差一点的。
代码如下
#include<stdio.h>
#include<stdlib.h>
#define MAX 500001
int n,a[MAX],t[MAX];
__int64 sum;
void Merge(int l, int m, int r)
{
int p=0;
int i=l,j=m+1;
while(i<=m&&j<=r)
{
if(a[i]>a[j])
{
t[p++]=a[j++];
sum+=m-i+1;
}
else
{
t[p++]=a[i++];
}
}
while(i<=m)
t[p++]=a[i++];
while(j<=r)
t[p++]=a[j++];
for(i=0;i<p;i++)
{
a[l+i]=t[i];
}
}
void MergeSort(int l,int r)
{
int m;
if(l<r)
{
m=(l+r)/2;
MergeSort(l,m);
MergeSort(m+1,r);
Merge(l,m,r);
}
}
void main()
{
int i;
while(1)
{
scanf("%d",&n);
if(n==0)
break;
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
MergeSort(0,n-1);
printf("%I64d\n",sum);
}
}