Ultra-quicksort
Time Limit: 7000MS |
|
Memory Limit: 65536K |
Total Submissions: 47014 |
|
Accepted: 17182 |
Description
In this problem, you has to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping, 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 what many swap operations Ultra-quicksort needs to perform in order to sort a given input sequenc E.
Input
The input contains several test cases. Every test case begins with a line this 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 is processed.
Output
For every input sequence, your program prints a single line containing an integer number OP, the minimum number of swap op Erations necessary to sort the given input sequence.
Sample Input
59105431230
Sample Output
60
Source
Test instructions: The number of interchanges to sort by bubbling in ascending order.
The puzzle: In order to insert the tree array sequentially, each statistic a[i] before the number of numbers, and then ans+=i-num;
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include < cstdlib> #include <cmath> #define N 5000010#define ll long longusing namespace std;int n;struct node {int x; int num;} A[n];int Bit[n];bool cmp_1 (node A,node b) {return a.x<b.x;} BOOL Cmp_2 (node A,node b) {return a.num<b.num;} int sum (int i) {int s=0; while (i>0) {s+=bit[i]; i-=i&-i; } return s;} void Add (int i,int x) {while (i<=n) {bit[i]+=x; i+=i&-i; }}int Main () {//freopen ("test.in", "R", stdin); while (Cin>>n&&n) {for (int i=1; i<=n; i++) {scanf ("%d", &a[i].x); A[i].num=i; } sort (a+1,a+n+1,cmp_1); for (int i=1; i<=n; i++)//discretization a[i].x=i; Sort (a+1,a+n+1,cmp_2); memset (bit,0,sizeof bit); ll Ans=0; for (int i=1; i<=n; i++) {ans+=i-sum (a[i].x)-1; Add (a[i].x,1); } printf ("%lld\n", ans); } return 0;}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
POJ 2299 Ultra-quicksort (tree-like array)