POJ2299——Ultra-QuickSort
2011-11-22 20:47
337 查看
View Code
题目大意:使用交换相邻元素的方法对数组排序,求最小的交换次数;
开始想用交换排序,发现数据是50w,伤不起啊==!继续用qsort,各种尝试各种WA啊( ⊙ o ⊙ )!
无奈用自己还不太熟的归并试试,A了……,对原来qsort的数据进行测试,发现2 3 1就不对了 T T!
上网找结题报告,貌似正常的做法是“树状数组+离散化”,不懂,以后再研究吧!!
参考代码:
#include<stdio.h> #define N 500001 __int64 op; int b , a ; void copy(int *a, int *b, int l, int r) { int i; for(i=l;i<=r;++i) { a[i] = b[i]; } } int Merge(int *a, int l,int mid,int r) { int i = l; int j = mid+1; while(i <= mid && j <= r) { if(a[i] < a[j]) { b[l++] = a[i++]; } else { b[l++] = a[j++]; op += mid-i+1; } } while(i<=mid) { b[l++] = a[i++]; } while(j<=r) { b[l++] = a[j++]; } return 0; } int Merge_Sort(int *a, int l,int r) { int mid; if(l<r) { mid=(l+r)/2; Merge_Sort(a, l, mid); Merge_Sort(a, mid+1,r); Merge(a, l, mid, r); copy(a, b, l, r); } return 0; } int main() { int n,i; while(scanf("%d",&n) != EOF && n) { op = 0; for(i=0;i<n;i++) { scanf("%d",a+i); } Merge_Sort(a, 0,n-1); printf("%I64d\n", op); } return 0; }
题目大意:使用交换相邻元素的方法对数组排序,求最小的交换次数;
开始想用交换排序,发现数据是50w,伤不起啊==!继续用qsort,各种尝试各种WA啊( ⊙ o ⊙ )!
无奈用自己还不太熟的归并试试,A了……,对原来qsort的数据进行测试,发现2 3 1就不对了 T T!
上网找结题报告,貌似正常的做法是“树状数组+离散化”,不懂,以后再研究吧!!
参考代码:
相关文章推荐
- poj 2299 c++:Ultra-QuickSort
- Poj 2299 Ultra-QuickSort【逆序数】
- POJ 2299 && ZOJ 2386 Ultra-QuickSort 线段树
- poj 2299 Ultra-QuickSort
- [POJ 2299]Ultra-QuickSort
- poj 2299 Ultra-QuickSort
- poj 2299 Ultra-QuickSort(树状数组)
- poj2299——Ultra-QuickSort(归并排序)
- POJ 2299 Ultra-QuickSort
- [POJ] 2299 -> Ultra-QuickSort
- POJ2299 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