poj 2299 Ultra-QuickSort :归并排序求逆序数
2013-08-29 13:12
513 查看
点击打开链接
Ultra-QuickSort
Description
![](http://poj.org/images/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
Sample Output
题目意图很明确了,就是给你一些数,求逆序数,但是数据量很大,普通的n^2求逆序数的方法铁定超时,所以只能用归并排序求逆序数,合并的时候,我们假设两部分为part1和part2,(part1在前,part2在后)这两部分已经排好序了,那么合并part1和part2的时候,如果part1的top1位置的数大于part2的top2位置的数,那么说明part1后面的那些数也都要比part2的top2位置的数大,所以逆序数就是mid到part1位置的距离
Ultra-QuickSort
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 34676 | Accepted: 12465 |
![](http://poj.org/images/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
题目意图很明确了,就是给你一些数,求逆序数,但是数据量很大,普通的n^2求逆序数的方法铁定超时,所以只能用归并排序求逆序数,合并的时候,我们假设两部分为part1和part2,(part1在前,part2在后)这两部分已经排好序了,那么合并part1和part2的时候,如果part1的top1位置的数大于part2的top2位置的数,那么说明part1后面的那些数也都要比part2的top2位置的数大,所以逆序数就是mid到part1位置的距离
#include<stdio.h> #include<iostream> using namespace std; int array[5000001]; __int64 flag = 0; void merg(int head, int tail) { int mid = (tail + head) / 2 + 1; int * new_array = new int[(tail - head) + 1]; int top1 = head; int top2 = mid; int i; for(i = 0; top1 < mid && top2 <= tail ; i++) { if(array[top1] > array[top2]) { new_array[i] = array[top2]; top2 ++; } else { new_array[i] = array[top1]; flag += top2 - (mid); top1 ++; } } if(top1 == mid && top2 <= tail) { while(top2 <= tail) new_array[i++] = array[top2++]; } else if(top1 != mid && top2 > tail) { while(top1 < mid) { new_array[i++] = array[top1++]; flag += tail - (mid) + 1; } } memcpy(&array[head], new_array, sizeof(int) * (tail - head + 1) ); } void mergsort(int head, int tail) { if(head >= tail) return ; mergsort(head, (head + tail) / 2); mergsort((head + tail) / 2 + 1, tail); merg(head, tail); } int main() { int n; while(scanf("%d", &n), n != 0) { int i; flag = 0; for(i = 0; i < n; i++) scanf("%d", &array[i]); mergsort(0, n - 1); printf("%I64d\n", flag); } 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 求逆序对,树状数组和归并排序
- (应用排序算法编程7.2.2)POJ 2299 Ultra-QuickSort(使用归并排序来计算逆序对的个数)
- poj 2299 Ultra-QuickSort——归并排序求逆序数,线段树离散化
- poj 2299 Ultra-QuickSort(归并排序求逆序对)
- POJ 2299 Ultra-QuickSort(树状数组+离散化 或 归并排序求逆序)
- poj 2299 Ultra-QuickSort 【线段树 or 线段树+lazy or 树状数组 or 归并排序】 求逆序对
- Ultra-QuickSort (poj 2299 归并排序 || 树状数组 求逆序对)
- POJ_2299_Ultra-quicksort_归并排序、逆序数
- poj 2299 Ultra-QuickSort【归并排序求逆序数】
- POJ 2299 Ultra-QuickSort 【归并排序 || 树状数组求逆序对数】
- 【POJ】2299 Ultra-QuickSort(逆序对)