poj2299—Ultra-QuickSort
2014-08-03 00:47
274 查看
Ultra-QuickSort
Time Limit:7000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Submit
Status
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
题目大意:交换相邻的两个数,求最小的操作数使该数组变成上升数组
思路:用归并排序求逆序数。
Time Limit:7000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Submit
Status
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
题目大意:交换相邻的两个数,求最小的操作数使该数组变成上升数组
思路:用归并排序求逆序数。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef __int64 LL ; LL a[500005],vis[500005]; LL ans; void sort2(LL a[], int begin, int mid, int end) { int i = begin; int j = mid + 1; int k = begin; while (i <= mid && j <= end) { if(a[i] <= a[j]) { vis[k++] = a[i++]; } else { vis[k++] = a[j++]; ans += mid - i +1; } } while(i <= mid) { vis[k++] = a[i++]; } while (j <= end) { vis[k++] = a[j++]; } for(i = begin; i <= end; i++) { a[i] = vis[i]; } } void sort1(LL a[],int begin, int end) { if(begin != end) { int mid = (begin + end)/2; sort1(a,begin,mid); sort1(a,mid+1,end); sort2(a,begin, mid, end); } } int main() { int n,i; while (scanf("%d",&n)&&n) { ans = 0; for(i = 0; i < n;i++) { scanf("%d",&a[i]); } sort1(a,0,n-1); printf("%I64d\n",ans); } return 0; }
相关文章推荐
- POJ 2299 Ultra-QuickSort
- 【POJ】2299 - Ultra-QuickSort(离散化 & (树状数组 | 线段树))
- poj2299 Ultra-QuickSort
- POJ 2299 Ultra-QuickSort(归并排序)
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- poj2299 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 离散化 + 树状数组
- poj - 2299 - Ultra-QuickSort(树状数组)
- Poj 2299 Ultra-QuickSort (归排求逆序数)
- POJ 2299 Ultra-QuickSort
- poj_2299_Ultra-QuickSort_201407251113