admin管理员组

文章数量:1571330

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

5
9
1
0
5
4
3
1
2
3
0

Sample Output

6

0

#include <iostream>
#include <cstdio>
# include <cstring>
# include<algorithm>
using namespace std;
typedef   long long  ll;
const int maxn=500000+5;

ll a[maxn],b[maxn];
ll tot;
void merge(int l,int m,int r)      // 两集合合并
{
    int i=l,j=m+1,h=l;
    while(i<=m&&j<=r)   
    {
        if(a[i]<a[j])
            { b[h++]=a[i];
            i++;
            }
        else
            {b[h++]=a[j];
            j++;
              tot+=m-i+1;
            }
    }
    while(i<=m)
    {
        b[h++]=a[i];
        i++;
    }
    while(j<=r)
    {
        b[h++]=a[j];
        j++;
    }
    for(i=l;i<=r;i++)         //还原 数组。。。。
        a[i]=b[i];

}
void  ermmge(int x,int y)        
{
    int m;
    if(x<y)
    {
        m=(x+y)/2;
        ermmge(x,m);          //递归调用  
        ermmge(m+1,y);        //拆成大小单个元素的集合
        merge(x,m,y);        
    }
}
int main()
{
    int t;
    while(~scanf("%d",&t)&&t!=0)
    {
        tot=0;
        for(int i=1;i<=t;i++)
             scanf("%lld", &a[i]);
        ermmge(1,t);
        printf("%lld\n",tot);
    }
}



本文标签: ultraQuickSort