[普及] 求序列中逆序对的个数 [poj 2299 Ultra-QuickSort]
2011-04-01 15:12
344 查看
http://poj.org/problem?id=2299 Ultra-QuickSort
模型转化成求一个数列中的逆序数的对数
n <= 500, 000
hint:利用归并排序的merge过程计算 O(nlogn)
代码反选可见
模型转化成求一个数列中的逆序数的对数
n <= 500, 000
hint:利用归并排序的merge过程计算 O(nlogn)
代码反选可见
#define N 500010 int num[N], tmp[N]; int n; long long res; void mergesort(int fr, int to) { if (to - fr > 1) { int mid = (to + fr) / 2; mergesort(fr, mid); mergesort(mid, to); int i = fr, j = mid, k; for (k = fr; i < mid && j < to && k < to; k++) { if (num[i] > num[j]) { res += mid - i; tmp[k] = num[j++]; } else { tmp[k] = num[i++]; } } if (i == mid) { while (j < to) { tmp[k] = num[j]; j++, k++; } } if (j == to) { while (i < mid) { tmp[k] = num[i]; i++, k++; } } for (k = fr; k < to; k++) { num[k] = tmp[k]; } } } int main() { int i, j, k; while (1) { scanf("%d", &n); if (0 == n) { break; } res = 0; for (i = 0; i < n; i++) { scanf("%d", num + i); } mergesort(0, n); cout << res << endl; } 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 【线段树 or 线段树+lazy or 树状数组 or 归并排序】 求逆序对
- 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 求逆序数 4种方法总结
- poj-2299-Ultra-QuickSort-归并排序求逆序数--或树状数组
- Poj 2299 - Ultra-QuickSort 离散化,树状数组,逆序对