描述: 求逆序对
思路: 归并排序
实现代码:
#include <stdio.h>
int is1[500001],is2[500001];
long long sum=0;
void merge(int low,int mid,int high)
{
int i=low,j=mid+1,k=low;
while(i<=mid&&j<=high)
if(is1[i]<=is1[j]) is2[k++]=is1[i++];
else {sum+=mid-i+1;is2[k++]=is1[j++];}
while(i<=mid) is2[k++]=is1[i++];
while(j<=high) is2[k++]=is1[j++];
for(i=low;i<=high;i++) is1[i]=is2[i];
}
void mergeSort(int a,int b)
{
if(a<b)
{
int mid=(a+b)/2;
mergeSort(a,mid);
mergeSort(mid+1,b);
merge(a,mid,b);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
sum=0;
for(int i=0;i<n;i++)scanf("%d",&is1[i]);
mergeSort(0,n-1);
printf("%lld\n",sum);
}
return 0;
}