Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 24722 | Accepted: 8847 |
Description
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
Output
#include<stdio.h>
#include<string.h>
#include<iostream>
#define maxn 500010
int a[maxn],left[maxn],right[maxn];
long long ans;
void merge(int a[],int p,int q,int r)
{
int n1=q-p+1;
int n2=r-q;
int i,j,k;
for(i=1;i<=n1;i++)
left[i]=a[p+i-1];
for(j=1;j<=n2;j++)
right[j]=a[q+j];
left[n1+1]=1e9; //設置一個哨兵
right[n2+1]=1e9; //同上
i=1;
j=1;
for(k=p;k<=r;k++)
if(left[i]<right[j])
a[k]=left[i++];
else
{
a[k]=right[j++];
ans+=n1-i+1; //計數;
}
}
void mergesort(int a[],int p,int r)
{
if(p<r)
{
int q=(p+r)/2;
mergesort(a,p,q);
mergesort(a,q+1,r);
merge(a,p,q,r); //合併步驟 p<=left<=q q<right<=r;
}
}
int init()
{
int i,n;
scanf("%d",&n);
if (n == 0) return 0;
memset(a,0,sizeof(a));
for(i = 1;i <= n;i++) scanf("%d",&a[i]);
ans = 0;
mergesort(a,1,n);
printf("%lld\n",ans);
return 1;
}
int main()
{
while (init()) ;
return 0;
}