codevs 3110 二叉堆练习3

Posted 日拱一卒 功不唐捐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs 3110 二叉堆练习3相关的知识,希望对你有一定的参考价值。

3110 二叉堆练习3

题目描述 Description

给定N(N≤500,000)和N个整数(较有序),将其排序后输出。

输入描述 Input Description

N和N个整数

输出描述 Output Description

N个整数(升序)

样例输入 Sample Input

5

12 11 10 8 9

样例输出 Sample Output

8 9 10 11 12

数据范围及提示 Data Size & Hint

对于33%的数据 N≤10000

对于另外33%的数据 N≤100,000  0≤每个数≤1000

对于100%的数据 N≤500,000  0≤每个数≤2*10^9

详细讲解见随笔:讲解——堆 http://www.cnblogs.com/TheRoadToTheGold/p/6238795.html

此篇随笔只提供代码

#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[500001];
int init()
{
    int x=0;char c=getchar();
    while(c<\'0\'||c>\'9\') c=getchar();
    while(c>=\'0\'&&c<=\'9\'){x=x*10+c-\'0\';c=getchar();}
    return x;
}
void heapify(int t)
{
    int left=t*2,right=t*2+1;
    int minn=t;//
    if(left<=n) {minn=a[minn]<a[left] ? minn:left;}
    if(right<=n){minn=a[minn]<a[right] ? minn:right;}
    if(minn!=t)
    {
        swap(a[minn],a[t]);
        heapify(minn);
    }
}
void build()
{
    for(int i=n/2;i;i--)
    heapify(i);
}
int get()
{
    int top=a[1];
    a[1]=a[n];
    n--;
    heapify(1);
    return top;
}
int main()
{
    n=init();
    for(int i=1;i<=n;i++) a[i]=init();
    build();
    while(n)  printf("%d ",get());
}

 

以上是关于codevs 3110 二叉堆练习3的主要内容,如果未能解决你的问题,请参考以下文章

codevs 2977 二叉堆练习1x

2977 二叉堆练习1 codevs

二叉堆练习3

codeVS 3110 二叉查找树做法

二叉堆部分练习

堆的判断(codevs 2879)