#include<stdio.h>
/*
* 题意:求逆序数;
* 思路:n<=500000,用冒泡或普通的方法求,肯定超时,
* 可以用归并排序或树状数组求,只需在二路归并时计算
* 就行了,数组L与R,若L[i]有元素大于R[j],则说明L
* 中有n1-i+1个大于R[j]的,即逆序数;
*/
#include<stdlib.h>
#define SIZE 500009
#define MAX 1000000000
__int64 count;
int num[SIZE+1];
int L[SIZE+1],R[SIZE+1];
void __merge(int l,int r)
{
int n1=(r+l)/2-l+1,i,j;
int n2=r-(r+l)/2;
for(i=1;i<=n1;i++)
L[i]=num[l+i-1];
for(j=1;j<=n2;j++)
R[j]=num[(r+l)/2+j];
L[n1+1]=MAX;
R[n2+1]=MAX;
i=j=1;
for(int k=l;k<=r;k++)
if(L[i]<=R[j])
num[k]=L[i++];
else
{
num[k]=R[j++];
count+=n1-i+1;
}
}
void mergeSort(int p,int r)
{
if(p<r)
{
int mid=(p+r)/2;
mergeSort(p,mid);
mergeSort(mid+1,r);
__merge(p,r);
}
}
int main()
{
int i,j,n;
while(scanf("%d",&n)&&n)
{
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
count=0;
mergeSort(1,n);
printf("%I64d\n",count);
}
return 0;
}
POJ 2299( Ultra-QuickSort)
最新推荐文章于 2022-12-15 12:59:42 发布