POJ - 2299 Ultra-QuickSort 【归并排序求逆序对】

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

 1 #include<iostream>
 2 using namespace std;
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cstdlib>
 6 long long cs = 0;
 7 void merge(long long source[], long long temp[], long long l, long long mid, long long r) {
 8     long long i = l, j = mid + 1;
 9     long long point = l;
10     while (i < mid + 1 && j < r + 1) {
11         if (source[i] < source[j])
12             temp[point++] = source[i++];
13         else
14             temp[point++] = source[j++],cs+=mid+1-i;
15     }
16     while (i < mid + 1) 
17         temp[point++] = source[i++];
18     while (j < r + 1) 
19         temp[point++] = source[j++];
20     for (i = l; i <= r; i++) 
21         source[i] = temp[i];
22 }
23 
24 void mergesort(long long source[], long long temp[], long long l, long long r) {
25     if (l >= r) return;
26     long long mid = (l + r) / 2;
27     mergesort(source, temp, l, mid);
28     mergesort(source, temp, mid + 1, r);
29     merge(source, temp, l, mid, r);
30 }
31 long long a[510000];
32 long long t[510000];
33 int main(){
34     long long n;
35     while(scanf("%lld",&n)!=EOF&&n){
36     for(long long i=0;i<n;i++)
37         scanf("%lld",&a[i]);
38     cs = 0;
39     mergesort(a,t,0,n-1);
40     cout<<cs<<endl;
41     }
42     return 0;
43 }

 



posted @ 2018-04-06 17:19  晓风微微  阅读(188)  评论(0编辑  收藏  举报