您的位置:首页 > 产品设计 > UI/UE

Poj 2299 Ultra-QuickSort【逆序数】

2016-03-02 16:31 393 查看
Ultra-QuickSort

Time Limit: 7000MS Memory Limit: 65536K
Total Submissions: 51736 Accepted: 18988
Description


In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is
sorted in ascending order. For the input sequence 
9 1 0 5 4 ,

Ultra-QuickSort produces the output 
0 1 4 5 9 .

Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Input

The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence
element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
Output

For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
Sample Input
5
9 1 0 5 4

3
1 2 3
0

Sample Output
6
0


归并排序求逆序数还是比较好的方法,不过又犯了上次的一个错误,给出的序列可能有50万个元素,逆序数最大可能有100多个以,远远超出了int 的范围,结果自己愣是没意识到,还是仔细纠错的时候才想到,做程序一定要细心考虑多方面的需要,不仅仅是为了比赛,任何时候都需要深思熟虑.....

#include<stdio.h>
int x[500005],y[500005];
long long ans;
void merge(int l,int r)
{
int a=l,mid=(l+r)>>1,b=mid+1,cnt=l;
while(a<=mid&&b<=r)
{
if(x[a]<=x[b])
{
y[cnt++]=x[a++];
}
else
{
ans+=(mid-a+1);
y[cnt++]=x[b++];
}
}
while(a<=mid)
{
y[cnt++]=x[a++];
}
while(b<=r)
{
y[cnt++]=x[b++];
}
for(int i=l;i<=r;++i)
{
x[i]=y[i];
}
}

void sort(int l,int r)
{
if(l<r)
{
int mid=(l+r)>>1;
sort(l,mid);sort(mid+1,r);
merge(l,r);
}
}

int main()
{
int n;
//freopen("shuju.txt","r",stdin);
while(scanf("%d",&n),n)
{
for(int i=0;i<n;++i)
{
scanf("%d",&x[i]);
}
ans=0;
sort(0,n-1);
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: