poj 2299 Ultra-QuickSort 初级->数据结构->排序-归并排序
来源:互联网 发布:如何利用网络招生 编辑:程序博客网 时间:2024/06/05 19:59
Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536K
Total Submissions: 30020 Accepted: 10729
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
Source
Waterloo local 2005.02.05
题意: 求逆序数。思想:利用归并排序求。// /* poj 2299 利用归并排序求逆序数// 3776 KB 1282 ms #include<iostream>#include<cstdio>#include<cstring>using namespace std;int a[500001],b[500001];long long sum,n;void mersort(int L,int R){ if(L>=R) return ; int mid=L+((R-L)>>1); mersort(L,mid); mersort(mid+1,R); int i=L,k=L,j=mid+1; while(i<=mid&&j<=R) { if(a[i]>a[j]) { b[k++]=a[j++]; sum+=mid-i+1; } else b[k++]=a[i++]; } while(i<=mid) b[k++]=a[i++]; while(j<=R) b[k++]=a[j++]; for(i=L;i<=R;i++) a[i]=b[i];}int main(){ int i; while(cin>>n,n) { for(i=1;i<=n;i++) cin>>a[i]; sum=0; mersort(1,n); cout<<sum<<endl; } return 0;}// */// /* 速度提升3倍多的求逆序数的归并算法,// 只求结果,不排序,所以速度快。牛逼// 3764 KB 375 ms #include<iostream>#include<cstring>#include<stdio.h>using namespace std;const int N = 500010;int num[N], t[N];long long n;long long merge_sort(int l, int r){ int mid, p, q, i, j, len; long long ans = 0; if(l >= r) return 0; mid = (l + r) >> 1; len = r - l + 1; ans += merge_sort(l, mid); ans += merge_sort(mid + 1, r); p = l; q = mid + 1; j = l; for(i = 0; i < len; ++i) if((q>r)|| (num[p]<num[q]&&p<=mid)) t[j++] = num[p++]; else { ans += mid - p + 1; t[j++] = num[q++]; } for(i = l; i <= r; ++i)num[i] = t[i]; return ans;}int main(){ int i; while(cin>>n,n){ for(i = 0; i < n; ++i) scanf("%d", num + i); printf("%lld\n",merge_sort(0,n-1)); for(i=1;i<=n;i++) cout<<num[i]; } return 0;}// */
- poj 2299 Ultra-QuickSort 初级->数据结构->排序-归并排序
- POJ 2299 Ultra-QuickSort(归并排序)
- POJ 2299 Ultra-QuickSort 归并排序
- POJ - 2299 Ultra-QuickSort【归并排序】
- POJ 2299 Ultra-QuickSort(归并排序)
- Ultra-QuickSort poj 2299 归并排序
- 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---归并排序
- 第十七周---带姓名的成绩单
- VS2008(2010)开发C++
- 获取table标签td所在行列号
- 体会函数参数传递
- SWT-designer注册步骤
- poj 2299 Ultra-QuickSort 初级->数据结构->排序-归并排序
- java文件操作
- Android SlidingDrawer ViewFlipper
- 17周项目1:体会函数参数传递(指针)
- Windows 7 64位安装Oracle XE(32位)数据库(REG_XE报错、字符集、批改8080端口等)
- container_of()传入结构体中的成员,返回该结构体的首地址
- 17周---项目1-体会函数参数传递----传递变量的地址
- LINK fatal error LNK1000 Internal error during IncrBuildImage的问题的解决
- 体会函数参数传递1