Ultra-QuickSort
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 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 5 9 1 0 5 4 3 1 2 3 0 Sample Output 6 0 |
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 500005;
int n;
int tree[maxn];
int a[maxn];
struct node{
int val,pos;
}p[maxn];
bool cmp(node a, node b){
return a.val < b.val;
}
int lowbit(int x) { return x&(-x); }
void Add(int a, int b)
{
while(a <= n){
tree[a] += b;
a += lowbit(a);
}
}
int Query(int x)
{
int ans = 0;
while(x>0){
ans += tree[x];
x -= lowbit(x);
}
return ans;
}
int main()
{
while(~scanf("%d",&n))
{
if(n==0) break;
memset(tree,0,sizeof tree);
for(int i = 1,x; i <= n; i++){
scanf("%d",&p[i].val);
p[i].pos = i;
}
sort(p+1,p+n+1,cmp);
for(int i = 1; i <= n; i++){ //離散化
a[p[i].pos] = i;
//printf("%d ",p[i].pos);
}
printf("\n");
long long ans = 0;
for(int i = 1; i <= n; i++){
Add(a[i],1);
ans += (i - Query(a[i]));
}
printf("%lld\n",ans);
}
}