• POJ 2299 Ultra-QuickSort


    Time Limit: 7000MS   Memory Limit: 65536K
    Total Submissions: 71503   Accepted: 26877

    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

    5
    9
    1
    0
    5
    4
    3
    1
    2
    3
    0
    

    Sample Output

    6
    0
    

    Source

    思路:求交换次数实际上就是求逆序对的个数,树状数组离散化后求解。ans开long long。
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n;long long ans;
    int num[500010],tree[500010];
    struct nond{
        int a,pos;
    }v[500010];
    int lowbit(int t){
        return t&(-t);
    }
    int cmp(nond x,nond y){
        return x.a<y.a;
    }
    void change(int x,int opt){
        for(int i=x;i<=n;i+=lowbit(i))
            tree[i]+=opt;
    }
    int sum(int x){
        int bns=0;
        for(int i=x;i>0;i-=lowbit(i))
            bns+=tree[i];
        return bns;
    }
    int main(){
        while(cin>>n&&n!=0){
            for(int i=1;i<=n;i++){
                scanf("%d",&v[i].a);
                v[i].pos=i;
            }    
            sort(v+1,v+1+n,cmp);
            for(int i=1;i<=n;i++)    num[v[i].pos]=i;
            for(int i=1;i<=n;i++){
                change(num[i],1);
                ans+=(i-sum(num[i]));
            }
            cout<<ans<<endl;ans=0;
            memset(tree,0,sizeof(tree)); 
        }
    }
  • 相关阅读:
    IOS 推送消息 php做推送服务端
    判断是否是iPhone5
    BeeFramework
    如何在类中获取request,和网站路径
    maven build 报release 400错误
    mysql启动问题access denied for user 'root'@'localhost'(using password:YES)
    adapter结构异常记录
    eclipse项目报红解决
    Location Type Project 'testma' is missing required source folder: 'src/test/resources' testma Build
    当遇到eclipse调试断点乱走数据不准确的时候,请maven clean,maven install
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/9656664.html
Copyright © 2020-2023  润新知