poj 2299 Ultra-QuickSort 初级->数据结构->排序-归并排序
2012-12-20 16:09
471 查看
Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536K
Total Submissions: 30020 Accepted: 10729
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
题意: 求逆序数。 思想:利用归并排序求。 // /* poj 2299 利用归并排序求逆序数 // 3776 KB 1282 ms #include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[500001],b[500001]; long long sum,n; void mersort(int L,int R) { if(L>=R) return ; int mid=L+((R-L)>>1); mersort(L,mid); mersort(mid+1,R); int i=L,k=L,j=mid+1; while(i<=mid&&j<=R) { if(a[i]>a[j]) { b[k++]=a[j++]; sum+=mid-i+1; } else b[k++]=a[i++]; } while(i<=mid) b[k++]=a[i++]; while(j<=R) b[k++]=a[j++]; for(i=L;i<=R;i++) a[i]=b[i]; } int main() { int i; while(cin>>n,n) { for(i=1;i<=n;i++) cin>>a[i]; sum=0; mersort(1,n); cout<<sum<<endl; } return 0; } // */ // /* 速度提升3倍多的求逆序数的归并算法, // 只求结果,不排序,所以速度快。牛逼 // 3764 KB 375 ms #include<iostream> #include<cstring> #include<stdio.h> using namespace std; const int N = 500010; int num , t ; long long n; long long merge_sort(int l, int r) { int mid, p, q, i, j, len; long long ans = 0; if(l >= r) return 0; mid = (l + r) >> 1; len = r - l + 1; ans += merge_sort(l, mid); ans += merge_sort(mid + 1, r); p = l; q = mid + 1; j = l; for(i = 0; i < len; ++i) if((q>r)|| (num[p]<num[q]&&p<=mid)) t[j++] = num[p++]; else { ans += mid - p + 1; t[j++] = num[q++]; } for(i = l; i <= r; ++i) num[i] = t[i]; return ans; } int main() { int i; while(cin>>n,n) { for(i = 0; i < n; ++i) scanf("%d", num + i); printf("%lld\n",merge_sort(0,n-1)); for(i=1;i<=n;i++) cout<<num[i]; } return 0; } // */
相关文章推荐
- POJ 2299 Ultra-QuickSort (归并排序)
- POJ 2299 Ultra QuickSort <树状数组+离散化 / 归并排序>
- POJ 2299 Ultra-QuickSort (归并排序、逆序数)
- poj 2299 Ultra-QuickSort 归并排序(求逆序数模板)
- POJ 2299 Ultra-QuickSort (归并排序求逆序对数)
- poj 2299 Ultra-QuickSort(归并排序)||(树状数组+离散化)
- POJ 2299 Ultra-QuickSort 【归并排序求逆序对数】
- POJ 2299 Ultra-QuickSort【归并排序】
- poj 2299 Ultra-QuickSort (归并排序 求逆序数)
- POJ - 2299 Ultra-QuickSort (归并排序)
- POJ 2299 Ultra-QuickSort(求逆序数,归并排序或者离散化+树状数组)
- POJ 2299 Ultra-QuickSort(归并排序)
- POJ 2299 Ultra-QuickSort 求逆序对数(归并排序,树状数组)
- poj 2299 Ultra-QuickSort(归并排序)||(树状数组+离散化)
- POJ 2299 Ultra-QuickSort 【归并排序 || 树状数组求逆序对数】
- poj 2299 Ultra-QuickSort(归并排序求逆序数)
- poj 2299 Ultra-QuickSort (归并排序,逆序数)
- [POJ] 2299 -> Ultra-QuickSort
- poj 2299 Ultra-QuickSort(归并排序)||(树状数组+离散化)
- POJ 2299 Ultra-QuickSort (归并排序)