Ultra-QuickSort(离散化+树状数组求逆序数)
2015-02-11 23:33
274 查看
Link:http://poj.org/problem?id=2299
[Submit] [Go Back] [Status]
[Discuss]
AC代码:
Ultra-QuickSort
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 |
[Discuss]
AC代码:
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; struct node{ int ord; int v; }a[500001]; int n,c[500001],aa[500001]; int lowbit(int p) { return p&(-p); } int sum(int p) { int s=0; while(p>0) { s+=c[p]; p-=lowbit(p); } return s; } void update(int p,int n,int k) { while(p<=n) { c[p]+=k; p+=lowbit(p); } } bool cmp(node a,node b) { return a.v<b.v; } int main() { __int64 ans; while(scanf("%d",&n)&&n) { memset(aa,0,sizeof(aa)); memset(c,0,sizeof(c)); for(int i=1;i<=n;i++) { scanf("%d",&a[i].v); a[i].ord=i; } sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) { aa[a[i].ord]=i; } ans=0; for(int i=1;i<=n;i++) { update(aa[i],n,1); ans+=(i-sum(aa[i])); } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- 【树状数组--求逆序数(离散化)】poj2299 Ultra-QuickSort
- 【树状数组】poj2299 Ultra-QuickSort(离散化+树状数组求逆序数)
- poj2299 Ultra-QuickSort&&NYOJ117 求逆序数 (树状数组求逆序对数+离散化)+(归并排序)
- poj2299 Ultra-QuickSort(离散化+树状数组求逆序数)
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- Ultra-QuickSort 【归并或树状数组+离散化】
- POJ 2299 -Ultra-QuickSort-树状数组求逆序数
- POJ 2299 Ultra-QuickSort(树状数组+离散化)
- POJ 2299 Ultra-QuickSort(树状数组+离散化)
- poj 2299 Ultra-QuickSort 树状数组求逆序数
- 树状数组的离散化 Ultra-QuickSort
- poj2299 Ultra-QuickSort(树状数组求逆序数,离散化)
- POJ 2299 Ultra-QuickSort (树状数组 + 离散化)
- 【POJ】2299 - Ultra-QuickSort(离散化 & (树状数组 | 线段树))
- poj2299:Ultra-QuickSort(树状数组+离散化)
- poj 2229 Ultra-QuickSort(树状数组求逆序数)
- 树状数组 离散化 求逆序数POJ 2299Ultra-QuickSort解题报告
- poj2299 Ultra-QuickSort (树状数组+离散化)
- poj 2299 Ultra-QuickSort 树状数组求逆序数
- POJ 2299 Ultra-QuickSort(树状数组求逆序数)