Time Limit: 7000 MS Memory Limit: 65536 KB
Description
![](http://acm.hrbust.edu.cn/vj/oj_static/poj/2299_desc_001.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
Waterloo local 2005.02.05
#include<cstdio>
#include<iostream>
using namespace std;
#define max 500002
int tp[max];
int arr[max],b[max];
long long cnt=0;//总逆序数
void q(int a[],int start,int mid,int end)
{
int i =start,j=mid+1,k=start;
while(i<=mid&&j<=end)
{
if(a[i]<=a[j])
{
cnt+=j-mid-1;
b[k++]=a[i++];
}
else
{
cnt+=j-k;
b[k++]=a[j++];
}
}
while(i<=mid)
{
cnt+=end-mid;
b[k++]=a[i++];
}
while(j<=end)
{
b[k++]=a[j++];
}
for(int i=start; i<=end; i++)
{
a[i]=b[i];
}
}
void p(int a[], int start,int end)
{
if(start<end)
{
int mid=(start+end)/2;
p(a,start,mid);
p(a,mid+1,end);
q(a,start,mid,end);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=-1)
{
if(n==0)
{
break;
}
for(int i=0; i<n; i++)
{
scanf("%d",&arr[i]);
}
cnt=0;
p(arr,0,n-1);
printf("%I64d\n",cnt/2);
}
return 0;
}
#include<iostream>
using namespace std;
#define max 500002
int tp[max];
int arr[max],b[max];
long long cnt=0;//总逆序数
void q(int a[],int start,int mid,int end)
{
int i =start,j=mid+1,k=start;
while(i<=mid&&j<=end)
{
if(a[i]<=a[j])
{
cnt+=j-mid-1;
b[k++]=a[i++];
}
else
{
cnt+=j-k;
b[k++]=a[j++];
}
}
while(i<=mid)
{
cnt+=end-mid;
b[k++]=a[i++];
}
while(j<=end)
{
b[k++]=a[j++];
}
for(int i=start; i<=end; i++)
{
a[i]=b[i];
}
}
void p(int a[], int start,int end)
{
if(start<end)
{
int mid=(start+end)/2;
p(a,start,mid);
p(a,mid+1,end);
q(a,start,mid,end);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=-1)
{
if(n==0)
{
break;
}
for(int i=0; i<n; i++)
{
scanf("%d",&arr[i]);
}
cnt=0;
p(arr,0,n-1);
printf("%I64d\n",cnt/2);
}
return 0;
}