UVa 10810 - Ultra-QuickSort
题目大意:给出一个数列,每次交换相邻数字,求排成递增序的最少交换次数。
分析:求逆序数,合并排序
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 5000010
using namespace std;
int a[maxn],tem[maxn],n;
long long Sort(int l,int r)
{
if(l<r)
{
long long L=Sort(l,(l+r)/2);
long long R=Sort((l+r)/2+1,r);
int p=l,mid1=(l+r)/2,mid2=(l+r)/2+1;
int k=l;
while(p<=mid1||mid2<=r)
{
if(mid2<=r&&(p>mid1||a[p]>a[mid2]))
{
tem[k++]=a[mid2++];
L+=mid1-p+1;
}
else
tem[k++]=a[p++];
}
for(int i=l;i<=r;i++)
a[i]=tem[i];
return L+R;
}
else
return 0;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
printf("%lld\n",Sort(0,n-1));
}
return 0;
}