STL 堆

洛谷P3378 【模板】堆

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=1e6+5;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
int n,op,x;
int a[N],len=0;
inline bool cmp(int a,int b){return a>b;}
int main(){
    n=read();
    for(int i=1;i<=n;i++){
        op=read();
        if(op==1){
            a[len++]=read();
            push_heap(a,a+len,cmp);
        }else if(op==2) printf("%d\n",a[0]);
        else pop_heap(a,a+len,cmp),len--;
    }
}
时间: 2024-10-19 23:05:42

STL 堆的相关文章

64 - 数据流中的中位数 || STL 堆

题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 思路解析 数据是从数据流读出,因此数组的个数是再逐渐的增加.如何选用一个容器,能够存储数据,并能够给出中位数. 无序数组:插入O(1) partation操作找出中位数 O(n) 有序数组:插入O(n) 找出中位数O(1) 有序链表:插入O(n) 找出中位数O(1) 搜索二叉树:插入O(logn)~O(

C++ STL堆操作

/* STL 最大堆.最小堆的应用 */ #include <iostream> #include <vector> #include <algorithm> // using namespace std; /* STL 堆操作 (1)make_heap()构造堆 void make_heap(first_pointer,end_pointer,compare_function); 默认比较函数是(<),即最大堆. 函数的作用是将[begin,end)内的元素处理

STL 堆的使用

本来是要写leetcode上的merge k sorted lists那道题目,这个题目我还是很熟悉的,毕竟是看过算法导论的人,但是写的过程中对堆的维护代码还是挺多的,所以我想到了STL中的堆.下面就来学习一下这个STL. 先介绍一个非常好的学习C++的网站 http://www.cplusplus.com/ 这个网站对C++的理解还是很好的,个人觉得比msdn要好不知道哪里去了. 对堆的操纵主要有以下四个: make_heap, pop_heap, push_heap, sort_heap 他

最小的n个和(STL堆的运用)

最小的n个和 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 109(26 users) Total Accepted: 22(19 users) Rating:  Special Judge: No Description 给定A.B两个数列,各包含n个数,分别从A和B中任意取一个数相加得到和,这样会有n^2种结果(包括重复的),求n^2个结果中前n个最小的和. Input 有多组测试数据. 对于每组测试数据,第一行为n,第二行为

stl 优先队列(堆)

[模板]堆 题目描述 如题,初始小根堆为空,我们需要支持以下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:

STL源码笔记(15)—堆和优先级队列(二)

STL源码笔记(15)-堆和优先级队列 优先级队列的源码实现基于heap的操作,底层容器默认是vector. 优先级队列简介 优先级队列跟队列类似,一端插入一端删除,不同的是,优先级队列的元素入队后会根据其优先级进行调整,默认情况下优先级高的将优先出队,在SGI STL中,优先级队列的功能保证由heap实现:stl_heap.h中,heap的分析见:STL堆源码分析 优先级队列构造函数 默认情况下,优先级队列使用vector作为底层容器,使用less作为比较函数,其在源码中的定义声明如下: te

【STL学习】堆相关算法详解与C++编程实现(Heap)

转自:https://blog.csdn.net/xiajun07061225/article/details/8553808 堆简介 堆并不是STL的组件,但是经常充当着底层实现结构.比如优先级队列(Priority Queue)等等. 堆是一种完全二叉树,因此我们可以用数组来存储所有节点.在这里的实现中,采用了一个技巧:将数组中索引为0的元素保留,设置为极大值或者为极小值(依据大顶堆或者小顶堆而定).那么当某个节点的索引是i时,其左子节点索引为2*i,右子节点索引为2*i+1.父节点是i/2

堆——练习题

--堆是一个很好用的东西,但遗憾的是,在oi混了三年多的我居然到现在才会--惭愧惭愧-- 堆可以在O(log n) 的时间内查询最大值和最小值,非常好用的一个数据结构,本人认为比优先队列快得多--只是本人观点-- 手写堆:不好写--没写过--反正c++有stl库(等到了左偏树再学--) stl堆:感谢c++有stl这种省时省力的好东西,要是noip开放所有库并允许o2 o3优化就更好了(退役之前不用想了) stl堆函数: make_heap:将一个数组建堆,例:对a[1]到a[100]建堆:ma

C++ 用template实现的堆

堆简介 堆并不是STL的组件,但是经常充当着底层实现结构.比如优先级队列(Priority Queue)等等. 堆是一种完全二叉树,因此我们可以用数组来存储所有节点.在这里的实现中,采用了一个技巧:将数组中索引为0的元素保留,设置为极大值或者为极小值(依据大顶堆或者小顶堆而定).那么当某个节点的索引是i时,其左子节点索引为2*i,右子节点索引为2*i+1.父节点是i/2(这里/表示高斯符号,取整).这种以数组表示树的方式,我们成为隐式表述法(implicit reprentation).我们这里