POJ 2299 Ultra-QuickSort

来源:互联网 发布:大富豪棋牌3.4源码 编辑:程序博客网 时间:2024/05/17 01:02

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

59105431230

Sample Output

60

Source

Waterloo local 2005.02.05

/*
      去年寒假集训的最后一周周赛题目,当时没做出来,知道是求将序列转化为有序序列需要交换的次数,当时想到了冒泡和逆序数,一直过不了,赛后学长讲题的时候说可以用树状数组加离散化处理,也可以用归并排序,也就是求序列的逆序数,7000MS明显坑人呀..
*/

#include <iostream>#include <algorithm>#include <cstring>#include <string>#include <stack>#include <cmath>#include <cstdio>#include <vector>#include <queue>using namespace std;struct node{    int x;    int pos;}a[500100];int L[500100],C[500100];long long ans;bool cmp(node x,node y){    return x.x < y.x;}void up(int x,int n){    while(x <= n)    {        C[x]+=1;        x+=(x&(-x));    }}int get(int x){    int sum = 0;    while(x > 0)    {        sum+=C[x];        x-=(x&(-x));    }    return sum;}int main(){    int n;    while(~scanf("%d",&n) && n)    {        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i].x);            a[i].pos = i;        }        sort(a+1,a+n+1,cmp);        for(int i=1;i<=n;i++)            L[a[i].pos] = i;        ans = 0;        memset(C,0,sizeof(C));        for(int i=1;i<=n;i++)        {            up(L[i],n);            ans+=i-get(L[i]);        }        printf("%lld\n",ans);    }    return 0;}


0 0
原创粉丝点击