POJ 2299 Ultra-QuickSort
来源:互联网 发布:cydia红包软件源 编辑:程序博客网 时间:2024/06/14 06:28
Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536KTotal Submissions: 52744 Accepted: 19331
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.
Ultra-QuickSort produces the output
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
59105431230
Sample Output
60
求逆序数,和 http://blog.csdn.net/sdfgdbvc/article/details/51171769 这题一模一样,可以复习一下
//归并排序 #include <stdio.h>#define MAX 500005int N;int a[MAX], b[MAX];long long sum;void Merge(int start, int mid, int end){int i = start, j = mid + 1, k = start;while(i <= mid && j <= end){if(a[i] <= a[j]){b[k++] = a[i++];}else{sum += j - k;b[k++] = a[j++];}}while(i <= mid){b[k++] = a[i++];}while(j <= end){b[k++] = a[j++];}for(i = start; i <= end; i++)a[i] = b[i]; }void MergeSort(int start, int end){if(end > start){int mid = (start + end) / 2;MergeSort(start, mid);MergeSort(mid+1, end);Merge(start, mid, end);}}int main(){int i;while(scanf("%d", &N) && N){sum = 0;for(i = 0; i < N; i++)scanf("%d", &a[i]);MergeSort(0, N-1);printf("%lld\n", sum);}return 0;}/*//树状数组 #include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 500005int N;int tree[MAX], f[MAX];struct P{int v;int num;} pro[MAX];int cmp(const void *a, const void *b){return (*(P*)a).v - (*(P*)b).v;}int lowbit(int x){return x & -x;}void updata(int n, int x){while(n <= N){tree[n] += x;n += lowbit(n);}}int find(int n){int sum = 0;while(n >= 1){sum += tree[n];n -= lowbit(n);}return sum;}int main(){int i;long long sum;while(scanf("%d", &N) != EOF && N){sum = 0;memset(tree, 0, sizeof(tree));for(i = 1; i <= N; i++){scanf("%d", &pro[i].v);pro[i].num = i;}qsort(pro+1, N, sizeof(pro[1]), cmp);int id = 1;f[pro[1].num] = 1;for(i = 2; i <= N; i++){if(pro[i].v == pro[i-1].v)f[pro[i].num] = id;elsef[pro[i].num] = ++id;}for(i = 1; i <= N; i++){updata(f[i], 1);sum += i - find(f[i]);}printf("%lld\n", sum);}return 0;}*/
0 0
- POJ 2299 Ultra-QuickSort
- poj 2299 Ultra-QuickSort
- poj 2299 Ultra-QuickSort
- poj 2299 Ultra-QuickSort
- poj 2299 Ultra-QuickSort
- poj 2299Ultra-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
- Android开发之小工具
- javascript第六天
- mybatis的增删查改(CRUD)
- spring中如何定义定时任务
- PHP--set_include_path和get_include_path用法详解
- POJ 2299 Ultra-QuickSort
- [Lintcode]Swap Nodes in Pairs
- 【C++】强制类型转换运算符
- Github的最简化使用方案
- iOS学习笔记32-iCloud入门
- Error:Execution failed for task ':app:buildInfoDebugLoader'. > Exception while doing past iteration
- 使用 matlab 数字图像处理(一)—— 归一化直方图
- 射线及其碰撞检测 [代码清单6-7]
- Android开源之BaseRecyclerViewAdapterHelper(持续更新!)