Ultra-QuickSort 梦里梦外; 2022-09-26 11:51 102阅读 0赞 Ultra-QuickSort <table> <tbody> <tr> <td><strong>Time Limit:</strong> 7000MS</td> <td> </td> <td><strong>Memory Limit:</strong> 65536K</td> </tr> <tr> <td><strong>Total Submissions:</strong> 56247</td> <td> </td> <td><strong>Accepted:</strong> 20768</td> </tr> </tbody> </table> Description ![2299_1.jpg][]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][] #include<iostream> #include<stdio.h> using namespace std; long long coun; int a[1000000],temp[1000000]; void mergearray(int a[],int first,int mid,int last) { int i=first; int j=mid+1; int m=mid; int n=last; int k=0; while(i<=m&&j<=n) { if(a[i]<=a[j]) { temp[k++]=a[i++]; } else { temp[k++]=a[j++]; coun+=m-i+1;//求逆序数 } } while(i<=m) { temp[k++]=a[i++]; } while(j<=n) { temp[k++]=a[j++]; } for(i=0; i<k; i++) { a[first+i]=temp[i]; } } void me(int a[],int first,int last) { int mid; if(first<last) { mid=(first+last)/2; me(a,first,mid); me(a,mid+1,last); mergearray(a,first,mid,last); } } int main() { int n; int i; while(~scanf("%d",&n)&&n) { coun=0; for(i=0; i<n; i++) { scanf("%d",&a[i]); } me(a,0,n-1); printf("%lld\n",coun); } return 0; } [2299_1.jpg]: http://poj.org/images/2299_1.jpg [Waterloo local 2005.02.05]: http://poj.org/searchproblem?field=source&key=Waterloo+local+2005.02.05
还没有评论,来说两句吧...