码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2299 Ultra-QuickSort

时间:2018-09-16 17:37:54      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:sizeof   i++   desc   image   tree   produce   ges   struct   sorted   

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)); 
    }
}

 

POJ 2299 Ultra-QuickSort

标签:sizeof   i++   desc   image   tree   produce   ges   struct   sorted   

原文地址:https://www.cnblogs.com/cangT-Tlan/p/9656664.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!