Poj 2299 Ultra-QuickSort (tree array/Reverse Order Number)
Ultra-QuickSort
Time Limit:7000 MS |
|
Memory Limit:65536 K |
Total Submissions:46080 |
|
Accepted:16763 |
Description
In this problem, you have to analyze a particle 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 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 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
#include
#include
#include
#include #include
using namespace std;int b[500005], c[500005];int n;struct node{ int num, id;} a[500005];bool cmp(node a, node b){ return a.num < b.num;}int lowbit(int x){ return x&(-x);}void update(int i, int x){ while(i <= n) { c[i] += x; i = i + lowbit(i); }}int sum(int i){ int sum = 0; while(i > 0) { sum += c[i]; i = i - lowbit(i); } return sum;}int main(){ int i; long long ans; while(scanf("%d", &n)!=EOF) { memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); for(i = 1; i <= n; i++) { scanf("%d", &a[i].num); a[i].id = i; } sort(a+1, a+n+1, cmp); b[a[1].id] = 1; for(i = 2; i <= n; i++) { b[a[i].id] = i; } ans = 0; for(i = 1; i <= n; i++) { update(b[i], 1); ans += (sum(n)-sum(b[i])); } printf("%lld\n", ans); } return 0;}