AC日记——二叉堆练习3 codevs 3110

Posted Only U - IU

tags:

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

3110 二叉堆练习3

 

 时间限制: 3 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
 
题目描述 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

 

思路:

  手写堆;

 

来,上代码:

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

using namespace std;

class T_heap {
    private:
        int heap[500001],n;
        
    public:
        void up(int now)
        {
            if(now<=1) return ;
            int front=now>>1;
            if(heap[front]>heap[now])
            {
                swap(heap[front],heap[now]);
                up(front);
            }
        }
        
        void down(int now)
        {
            if(now>n) return;
            int vlc,vrc,next=now;
            bool blc,brc;
            if((now<<1)<=n) blc=true,vlc=heap[now<<1];
            else blc=false;
            if((now<<1|1)<=n) brc=true,vrc=heap[now<<1|1];
            else brc=false;
            if(blc)
            {
                if(vlc<heap[next])
                {
                    next=now<<1;
                }
            }
            if(brc)
            {
                if(vrc<heap[next])
                {
                    next=now<<1|1;
                }
            }
            if(next!=now)
            {
                swap(heap[next],heap[now]);
                down(next);
            }
        }
        
        void push(int cur_)
        {
            n++;
            heap[n]=cur_;
            up(n);
        }
        
        void pop()
        {
            heap[1]=heap[n];
            n--;
            down(1);
        }
        
        int top()
        {
            return heap[1];
        }
};
class T_heap heap;

int n,ai;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&ai);
        heap.push(ai);
    }
    for(int i=1;i<=n;i++)
    {
        printf("%d ",heap.top());
        heap.pop();
    }
    return 0;
}

 

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

codevs 2977 二叉堆练习1x

2977 二叉堆练习1 codevs

AC日记——平衡树练习 codevs 4244

AC日记——绿色通道 codevs 3342

AC日记——爱改名的小融3 codevs 3156

二叉堆练习3