POJ 2299 Ultra-QuickSort【归并排序】

来源:互联网 发布:appserv是什么软件 编辑:程序博客网 时间:2024/06/14 07:59

Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536K
Total Submissions: 64050 Accepted: 23920
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
Source

Waterloo local 2005.02.05

1297ms

#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn = 5e5 + 5;#define LL long long intint n, a[maxn], t[maxn];LL ans;void Merg_Sort(int x, int y){    if (y - x <= 1)        return;    int mid = x + (y - x) / 2;    Merg_Sort(x, mid);    Merg_Sort(mid, y);    int p = x;    int q = mid;    int i = x;    while (p < mid || q < y)    {        if (q >= y || (p < mid&&a[p] <= a[q]))        {            t[i++] = a[p++];        }        else        {            if (p < mid)                ans += (mid - p);            t[i++] = a[q++];        }    }    for (i = x; i < y; i++)    {        a[i] = t[i];    }}int main(){    while (cin >> n&&n)    {        memset(a, 0, sizeof(a));        memset(t, 0, sizeof(t));        for (int i = 0; i < n; i++)        {            cin >> a[i];        }        ans = 0;        Merg_Sort(0, n);        cout << ans << endl;    }    return 0;}
原创粉丝点击