【poj 2299】 Ultra-QuickSort 【Waterloo local 2005.02.05】

来源:互联网 发布:linux 复制命令 编辑:程序博客网 时间:2024/06/05 18:31

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.

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

59105431230

Sample Output

60

这道题只是求逆序对个数,注意数字比较大,数组和答案要用long long存,下面是程序:

#include<stdio.h>#include<iostream>#define ll long longusing namespace std;ll a[500005],tp[500005],s=0;ll ch(){ll s=0;char c=getchar();while(c<'0'||c>'9'){c=getchar();}while(c>='0'&&c<='9'){s*=10;s+=c-'0';c=getchar();}return s;}int read(ll *p,int &n){n=ch();int i;for(i=1;i<=n;i++){p[i]=ch();}return n;}void out(ll x){if(x>9){out(x/10);}putchar(x%10+'0');}void h(int l,int m,int r,ll *p,ll *tp){int i=l,j=m+1,k=l;while(i<=m&&j<=r){if(p[i]>p[j]){tp[k++]=p[j++];s+=m-i+1;}else{tp[k++]=p[i++];}}while(i<=m){tp[k++]=p[i++];}while(j<=r){tp[k++]=p[j++];}for(i=l;i<=r;i++){p[i]=tp[i];}}void msort(int l,int r,ll *p,ll *tp){if(l==r){return;}int m=l+r>>1;msort(l,m,p,tp);msort(m+1,r,p,tp);h(l,m,r,p,tp);}int main(){int n;while(read(a,n)){s=0;msort(1,n,a,tp);out(s);putchar('\n');}return 0;}

原创粉丝点击