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.
Ultra-QuickSort produces the output
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 }