Ultra-QuickSort
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 29980 | Accepted: 10712 |
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.
Ultra-QuickSort produces the output
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
Source
这题其实就是归并排序,然后统计改变的个数,但是数据有64位整数的,一开始就是这个原因错了。
#include <iostream>
#include <cstring>
using namespace std;
__int64 a[500010],sum;
__int64 b[500010],c[500010];
int main()
{
void sort(int x,int y);
int i,j,n,m,s,t;
while(cin>>n)
{
if(n==0)
{
break;
}
sum=0;
for(i=0;i<=n-1;i++)
{
cin>>a[i];
}
sort(0,n-1);
cout<<sum<<endl;
}
return 0;
}
void f(int x,int mid,int y)
{
int l1,l2,i,j;
int u;
l1=mid-x+1;
l2=y-mid;
for(i=0;i<=l1-1;i++)
{
b[i]=a[x+i];
}
for(i=0;i<=l2-1;i++)
{
c[i]=a[mid+1+i];
}
i=0; j=0; u=1;
while(i<=l1-1&&j<=l2-1)
{
if(b[i]>c[j])
{
a[x]=c[j]; sum+=(l1-u+1); x++;j++;
}else
{
a[x]=b[i]; x++; i++; u++;
}
}
while(i<=l1-1)
{
a[x]=b[i];
x++; i++;
}
while(j<=l2-1)
{
a[x]=c[j];
x++; j++;
}
}
void sort(int x,int y)
{
int mid;
if(x<y)
{
mid=(x+y)/2;
sort(x,mid);
sort(mid+1,y);
f(x,mid,y);
}
}