zoukankan      html  css  js  c++  java
  • POJ 2299 Ultra-QuickSort

    离散化+树状数组求逆序数

    Ultra-QuickSort
    Time Limit: 7000MSMemory Limit: 65536K
    Total Submissions: 35024Accepted: 12608

    Description

    POJ 2299 Ultra-QuickSort - qhn999 - 码代码的猿猿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 ≤ 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

     


    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>

    using namespace std;

    struct node
    {
        int v,ord;
    }s[550000];

    bool cmp(node a,node b)
    {
        return a.v<b.v;
    }

    int ar[550000],tree[550000],n;

    int lowbit(int x)
    {
        return x&-x;
    }

    void update(int x,int v)
    {
        while(x<=n)
        {
            tree[x]+=v;
            x+=lowbit(x);
        }
    }

    int getsum(int x)
    {
        int sum=0;
        while(x>0)
        {
            sum+=tree[x];
            x-=lowbit(x);
        }
        return sum;
    }

    int main()
    {
        while(scanf("%d",&n)&&n)
        {
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&s.v);
                s.ord=i;
            }
            sort(s+1,s+n+1,cmp);
            for(int i=1;i<=n;i++)
                ar[s.ord]=i;
            memset(tree,0,sizeof(tree));
            long long int ans=0;
            for(int i=1;i<=n;i++)
            {
                update(ar,1);
                ans+=i-getsum(ar);
            }
            printf("%I64d ",ans);
        }
        return 0;
    }
    * This source code was highlighted by YcdoiT. ( style: Codeblocks )

  • 相关阅读:
    C语言寒假大作战03
    C语言寒假大作战02
    C语言寒假大作战01
    C语言Ⅰ作业12—学期总结
    C语言Ⅰ博客作业11
    C语言Ⅰ博客作业10
    C语言Ⅰ博客作业09
    C语言Ⅰ博客作业08
    C语言ll作业01
    C语言寒假大作战04
  • 原文地址:https://www.cnblogs.com/CKboss/p/3350836.html
Copyright © 2011-2022 走看看