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:

2
5

说明

时空限制:1000ms,128M

数据规模:

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

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

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

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
    int n;
    scanf("%d",&n);
    int pd;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&pd);
        if(pd==1)
        {
            int v;
            scanf("%d",&v);
            q.push(v);
        }
        if(pd==2)
        {
            printf("%d\n",q.top());
        }
        if(pd==3)
        {
            q.pop();
        }
    }
    return 0;
}

一直不会stl堆(以前一直手写堆),今天终于学会了,谢谢cyc的指导;

下来是一道运用stl堆的题----合并果子;

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int n;
priority_queue<int,vector<int>,greater<int> >q;
int map[10010];
int main()
{
    scanf("%d",&n);
    int ans=0;
    for(int i=1;i<=n;i++) scanf("%d",&map[i]),q.push(map[i]);
    for(int i=2;i<=n;i++)
    {
        int v=q.top();q.pop();
        int u=q.top();q.pop();
        ans+=v+u;
        q.push(v+u);
    }
    printf("%d",ans);
    return 0;
}

时间: 2024-11-03 14:45:45

stl 优先队列(堆)的相关文章

STL 优先队列的自定义比较函数与 sort() 等泛型算法的自定义比较函数的区别

前言 最近在刷算法题,常常需要自定义比较函数作为作为函数对象送入 stl 中,遇到了下面的问题: 泛型算法 sort() 的比较函数是这么写: //sort() 实现元素间关系为递增的比较函数 struct cmp{ bool operator () (const T& a, const T& b) const { return a.x < b.x; } }; //或者这样bool operator < (const T& a, const T& b) cons

poj3253 Fence Repair STL优先队列

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://poj.org/problem?id=3253 Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of wood, each

ZOJ2724_Windows Message Queue(STL/优先队列)

解题报告 题意: 看输入输出就很明白. 思路: 优先队列. #include <algorithm> #include <iostream> #include <cstring> #include <cmath> #include <queue> #include <vector> #include <cstdio> #include <map> using namespace std; struct node

优先队列(堆)

优先队列(priority queue)是允许至少两种操作的数据结构:Insert及DeleteMin(删除最小者).相当于队列中的Enqueue.Dequeue操作. 优先队列可以用链表.二叉查找树.二叉堆等实现. 二叉堆 1. 结构性质 堆(heap)是一棵完全被填满的二叉树,有可能的例外是在底层,底层上的元素从左向右填入.这样的树称之为完全二叉树. 一棵高为h的完全二叉树有2h到2h+1-1个节点.完全二叉树的高为logN. 完全二叉树可以用数组来表示,如果从0开始,对于数组中任意i位置的

STL+优先队列

1 #include<iostream> 2 #include<queue> 3 #include<string.h> 4 using namespace std; 5 const int INF =100000000; 6 const int MAXN =1000; 7 const int MAXM =100000; 8 int m,n; 9 int first[MAXN],d[MAXN]; 10 int u[MAXM],v[MAXM],w[MAXM],next[MA

UVA - 136 Ugly Numbers(丑数,STL优先队列+set)

Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ... shows the first 11 ugly numbers. By convention, 1 is included. Write a program to find and print the 1500'th ugly number. Input Ther

STL之堆和优先队列

STL中的heap是用数组来进行模拟的,heap 本身的定义就是一颗完全的二叉树(注意和满二叉树的区别). heap分为大根堆和小根堆. 堆的主要操作由构建堆,调整堆,这两个. 其中有一个heap算法就是在此基础之上的. 构建好一颗大根堆,然后 将根顶元素和最后一个元素呼唤,将堆的大小减1,同时再次调整堆为大根堆,重复直至堆的大小为0. 由于堆结构本上是类似分组划分的,其中修改也就是修改这条路径上的,和其他元素没有关系,因此,每次修改的时候也就是路径长度,也就是二叉树的高度. template

STL优先队列的使用

STL中有一个优先队列的容器可以使用. [头文件] queue 队列容器 vector 向量容器 [操作] 优先级队列支持的操作 q.empty()         如果队列为空,则返回true,否则返回false q.size()            返回队列中元素的个数 q.pop()             删除队首元素,但不返回其值 q.top()             返回具有最高优先级的元素值,但不删除该元素 q.push(item)     在基于优先级的适当位置插入新元素 1

STL之堆操作

首先来看完全二叉树的定义: 若设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树.而将一维数组视为完全二叉树书得到的即为堆. 堆效率极高,像十分常用的排序算法.Dijkstra算法.Prim算法等都要用堆才能优化,几乎每次都要考到的二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树. STL中与堆相关的4个函数--建立堆make_heap(),在堆中添加数据push_heap(),在堆中删除数据