[归并排序][逆序数]Ultra-QuickSort
Description
![](http://poj.org/images/2299_1.jpg)
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
题意:要求使序列变为递增序列的最小交换相邻元素的次数;
思路:归并排序求逆序数;
AC代码:
#include <iostream> #include<cstdio> #include<algorithm> #define N 500010 typedef long long ll; using namespace std; ll a[N]; ll ans=0; ll tmp[N]; void merge_(int l,int m,int r){ int cnt=0; int i,j; for(i=l,j=m+1;i<=m&&j<=r;){ if(a[i]<=a[j]) {tmp[++cnt]=a[i]; i++;} else{ tmp[++cnt]=a[j]; j++; ans+=(m-i+1); } } while(i<=m) {tmp[++cnt]=a[i]; i++;} while(j<=r) {tmp[++cnt]=a[j]; j++;} for(i=l,j=1;i<=r&&j<=cnt;i++,j++) a[i]=tmp[j]; } void merge_sort(int l,int r){ if(l==r) return; if(l<r){ int m=(l+r)>>1; merge_sort(l,m); merge_sort(m+1,r); merge_(l,m,r); } } int main() { int n; while(scanf("%d",&n)!=EOF&&n){ for(int i=1;i<=n;i++) cin>>a[i]; ans=0; merge_sort(1,n); cout<<ans<<endl; } return 0; }
配图不是很懂啊?
转载请注明出处:https://www.cnblogs.com/lllxq/