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

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

时间:2016-12-31 09:45:10      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:iostream   scan   down   des   esc   bsp   false   namespace   范围   

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

标签:iostream   scan   down   des   esc   bsp   false   namespace   范围   

原文地址:http://www.cnblogs.com/IUUUUUUUskyyy/p/6238747.html

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