POJ 2299 Ultra-QuickSort
来源:互联网 发布:2017微博怎么看微数据 编辑:程序博客网 时间:2024/05/21 20:27
Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536KTotal Submissions: 45088 Accepted: 16376
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
Source
Waterloo local 2005.02.05
归并排序,求逆序数。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define maxn 500005long long n,cnt;long long arr[maxn];long long b[maxn];void divide(int low, int high);void mergeSort(int low,int mid,int high);int main(){ while(scanf("%d",&n)!= EOF && n){ cnt = 0; for(int i = 0 ; i < n;i++){ scanf("%d",&arr[i]); } divide(0,n);// for(int i = 0; i < n ;i++){// cout << arr[i] << " ";// }// cout << endl << cnt << endl; cout << cnt << endl; } return 0;}void divide(int low, int high){ if(high <= low +1){ return ; } if(high == low + 2){ if(arr[low] > arr[high - 1]){ swap(arr[low],arr[high-1]); cnt ++; } return ; } if(low < high){ int mid = (low + high) /2; divide(low,mid); divide(mid,high); mergeSort(low,mid,high); }}void mergeSort(int low,int mid,int high){ int i = low, j = mid, k = low; while(i < mid || j < high){ if(j >= high || ( i < mid && arr[i] <= arr[j])){ b[k++] = arr[i++]; } else { if(i < mid) cnt += (mid-i); b[k++] = arr[j++]; } } for(i = low;i < high;i++){ arr[i]=b[i]; }}
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
- Visual Studio中/MD /MDd /MT /MTd的含义以及_ITERATOR_DEBUG_LEVEL错误的解决方法
- 算法训练 Torry的困惑(基本型)
- 浅析:四层代理和应用层代理常见应用
- Android webView 缓存 Cache + HTML5离线功能
- UIImagePickerController 用法详解
- POJ 2299 Ultra-QuickSort
- 单例模式详解
- PL/SQL之存储过程
- 计算机网络知识储备总结
- C语言-循环队列的简单实现
- 随机数生成及微信红包
- 让一切都停下来——Unschedule
- Leetcode: Factorial Trailing Zeroes
- 饿汉式单例模式和懒汉式单例模式