BIT2014级软件学院程序设计-15 Ultra-QuickSort

来源:互联网 发布:手机淘宝寄快递在哪里 编辑:程序博客网 时间:2024/06/05 17:35

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 <= 100,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

 Notice

The answer may be very large. You can use "long long" to store the answer and "%lld" to print it.

用归并排序做很简单。当然也可以用树状数组来做。

我是用的归并

#include <stdio.h>#include <string.h>int N, A[500010], T[500010];long long ans;void Merg_Sort(int x,int y){    if(y-x<=1) return;    int mid;mid = x + (y-x)/2;    Merg_Sort(x,mid);    Merg_Sort(mid,y);    int p = x, q = mid, i=x;    while(p<mid || q<y)    {        if(q>=y || (p<mid && A[p] <= A[q])) T[i++] = A[p++];        else//else的条件是(p==mid || A[q] < A[p])        {            if(p<mid)ans+=(mid-p);//由于是p<mid,所以此时也就是相当于 A[q] < A[p]            T[i++] = A[q++];       //上面同时A[p]是第一个<A[q]的数,所以+后面还有的数(mid-p)        }    }    for(i=x;i<y;i++)    {        A[i] = T[i];    }}int main(){    while(scanf("%d", &N) && N)    {    int i;memset(A,0,sizeof(A));memset(T,0,sizeof(T));        for(i=0;i<N;i++)        {            scanf("%d", &A[i]);        }        ans = 0;        Merg_Sort(0,N);        printf("%lld\n",ans);//结果会超int32    }    return 0;}


0 0