堆(模板)

题目描述

如题,初始小根堆为空,我们需要支持以下3种操作:

操作1: 1 x 表示将x插入到堆中

操作2: 2 输出该小根堆内的最小数

操作3: 3 删除该小根堆内的最小数

输入输出格式

输入格式:

第一行包含一个整数N,表示操作的个数

接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下:

操作1: 1 x

操作2: 2

操作3: 3

输出格式:

包含若干行正整数,每行依次对应一个操作2的结果。

输入输出样例

输入样例#1:

5
1 2
1 5
2
3
2

输出样例#1:

2
5

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=15

对于70%的数据:N<=10000

对于100%的数据:N<=1000000(注意是6个0。。。不过不要害怕,经过编者实测,堆是可以AC的)

样例说明:

故输出为2、5

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

using namespace std;

int n,m,x,size;
int heap[1000005];

void push(int x)
{
    int now,next;
    heap[++size]=x;
    now=size;
    while(now>1)
    {
        next=now/2;
        if(heap[next]<=heap[now])    break;
        swap(heap[next],heap[now]);
        now=next;
    }
}

void pop()
{
    heap[1]=heap[size--];
    int now=1,next;
    while(now*2<=size)
    {
        next=now*2;
        if(next<size&&heap[next]>heap[next+1])    next++;
        if(heap[next]>=heap[now])    break;
        swap(heap[next],heap[now]);
        now=next;
    }
}

int main()
{
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        if(m==1)
        {
            scanf("%d",&x);
            push(x);
        }
        if(m==2)
            cout<<heap[1]<<endl;
        if(m==3)
            pop();
    }
    return 0;
}
时间: 2024-10-10 23:04:35

堆(模板)的相关文章

堆模板(pascal)洛谷P3378

题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: 第一行包含一个整数N,表示操作的个数 接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下: 操作1: 1 x 操作2: 2 操作3: 3 输出格式: 包含若干行正整数,每行依次对应一个操作2的结果. 输入输出样例 输入样例#1: 5 1 2 1 5 2 3 2 输出样例#1: 2 5 说明

poj 3253 初涉二叉堆 模板题

这道题很久以前就做过了 当时是百度学习了优先队列 后来发现其实还有个用sort的办法 就是默认sort排序后 a[i]+=a[i-1] 然后sort(a+i,a+i+n) (大概可以这样...答案忘了...) 嗯...其实标准解法是二叉堆.. 主函数里面的while里面wa了好多次.. 每次都选最小的那俩相加 再放回去 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std

堆模板

[emmm] 堆其实就是一个完全二叉树:叶子节点都在最后两层且集中在左侧.大(小)根堆的定义就是:每一个节点的权值大于等于(小于等于)其左右儿子(若存在). 支持的操作有: 插入 删除(根节点或者非根节点) 查询根的权值 [代码] 1 #include <bits/stdc++.h> 2 using namespace std; 3 int heap[100010],tot; 4 void up(int p) 5 { 6 while(p>1) 7 if(heap[p]>heap[p

hud2544dijkstra+堆优化

该算法对于稠密图更加有效: 对于给出具有非负权重的边和源顶点S的图G,算法可在O(mlogn)时间内找出从s点到其他每一个顶点的距离. 如果图是稠密的,即对于某个ε>0,m>=n^(1+ε),可以被改善在O(m/ε)内执行.(m为图的边数,n为图的定点数) 最小堆模板: 1 struct HeapElement { 2 // key存储顶点序号,value存储到该顶点的最短距离 3 int key, value; 4 }; 5 struct MinHeap { 6 HeapElement he

P1801 黑匣子[堆]

题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ADD(x):把x元素放进BlackBox; GET:i加1,然后输出Blackhox中第i小的数. 记住:第i小的数,就是Black Box里的数的按从小到大的顺序排序后的第i个元素.例如: 我们来演示一下一个有11个命令的命令串.(如下图所示) 现在要求找出对于给定的命令串的最好的处理方法.AD

第十章笔记&#183;优先级队列

需求与动机 什么是优先级队列 优先队列是计算机科学中的一类抽象数据类型.优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务:优先级相同的元素按照其在优先队列中的顺序得到服务.优先队列往往用堆来实现. --wikipedia 应用需求 在医院门诊,如果只有一个医生,多位病人.按照通常流程来说,采用先到先服务的顺序(FIFO).但是如果病人中有人患有心脏病,那么显然这个病人需要得到优先治疗. 在计算机系统中,绝大多数支持多任务,这种多任务调度也类似于医院门诊.CPU相当于医生,计算任

霍夫曼编码(Huffman Code) 简单模拟

这周的数据结构实验作业,刚好被抽到号要上交,于是乎在宿舍写了一晚上. 若有错漏之处请斧正! 关于建树的参考博文:http://blog.csdn.net/xgf415/article/details/52628073 实验要求如下: 编译器:VS 2015 运行环境: WIN 10 代码如下: hfmTree.h 1 #include <string> 2 #include "MinHeap.h" 3 #include <stack> 4 #include &l

详解C++ STL priority_queue 容器

详解C++ STL priority_queue 容器 本篇随笔简单介绍一下\(C++STL\)中\(priority_queue\)容器的使用方法和常见的使用技巧. priority_queue容器的概念 \(priority_queue\)在英文中是优先队列的意思. 队列是一种基本的数据结构.其实现的基本示意图如下所示: 而\(C++STL\)中的优先队列就是在这个队列的基础上,把其中的元素加以排序.其内部实现是一个二叉堆.所以优先队列其实就是把堆模板化,将所有入队的元素排成具有单调性的一队

leetcode 703. Kth Largest Element in a Stream &amp; c++ priority_queue &amp; minHeap/maxHeap

703. Kth Largest Element in a Stream & c++ priority_queue & minHeap/maxHeap 相关链接 leetcode c++ priority_queue cplusplus c++ priority_queue cnblog 背景知识 ??堆是算法中常用的数据结构之一,其结构是完全二叉树,但实现的方法最常见的是使用数组:这里主要介绍小顶堆,其根元素最小,对于任何一个节点来说,他都比其后代要小:访问器根元素的时间为O(1):树的

hdu 2544 单源最短路问题 dijkstra+堆优化模板

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41168    Accepted Submission(s): 17992 Problem Description 在每年的校赛里.全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的.所以如今他们想要寻