Ultra-QuickSort
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 15456 | Accepted: 5446 |
Description
![](images/2299_1.jpg)
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
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long a[500005],t[500005],cnt;
void merge_sort(int x,int y)
{
if(y-x>1)
{
int m=x+(y-x)/2;
int p=x,q=m,i=x;
merge_sort(x,m);
merge_sort(m,y);
while(p<m||q<y)
{
if(q>=y||(p<m&&a[p]<=a[q])) t[i++]=a[p++];
else {t[i++]=a[q++];cnt+=m-p;}
}
for(i=x;i<y;i++) a[i]=t[i];
}
}
int main()
{
long n;
while(scanf("%d",&n)==1&&n)
{
memset(a,0,sizeof(a));
memset(t,0,sizeof(t));
for(int i=0;i<n;i++) cin>>a[i];
cnt=0;
merge_sort(0,n);
cout<<cnt<<endl;
}
return 0;
}