Ultra-QuickSort
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 39410 | Accepted: 14209 |
Description
![](http://poj.org/images/2299_1.jpg)
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
#include<iostream>
#include<cstring>
#define M 500005
using namespace std;
long long ans,a[M],vis[M];//数据大
void merge_sort(long long * A,int x,int y,long long * T)
{
int p,q,i,m;
if(y-x>1){
int m=x+(y-x)/2;//划分数组
p=x;q=m;i=x;
merge_sort(A,x,m,T);//递归排序
merge_sort(A,m,y,T);
while(p<m||q<y){
if(q>=y||(p<m&&A[p]<=A[q]))T[i++]=A[p++];//将元素复制到辅助数组中
else {T[i++]=A[q++];
ans+=m-p;//逆序数就是累加后面比自己小的数的个数
}
}
for(i=x;i<y;i++) A[i]=T[i];//将辅助数组中的元素复制回A数组
}
}
int main()
{
int n,i,j;
while(cin>>n,n)
{
for(i=0;i<n;i++)
cin>>a[i];
ans=0;
merge_sort(a,0,n,vis);
cout<<ans<<endl;
}
}