码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 10810 - Ultra-QuickSort

时间:2015-03-12 18:47:07      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:给出一个数列,每次交换相邻数字,求排成递增序的最少交换次数。

分析:求逆序数,合并排序

#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;
}

UVa 10810 - Ultra-QuickSort

标签:

原文地址:http://www.cnblogs.com/tsw123/p/4333048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!