题目描述

众所周知,懒羊羊是所有小羊里最贪吃的一只。然而,鲜为人知的是,懒羊羊也有存储粮食的习惯。而更让大家吃惊的事实是,我们的懒羊羊做事很有条理,每当他存储一份粮食时,他会专门拿出一个筐来存放。因此,他的仓库里有很多很多筐的青草。而我们的懒羊羊又是一个经常馋嘴的小羊,每当他想吃草时,就会从仓库里找出数量最少的一筐草,把它吃掉。可是懒羊羊因为草吃得太多了导致大脑运转缓慢,所以他不得不向你请求支援,帮他找出他应该吃数量为多少的青草。

输入

第一行为一个正整数n,表示懒羊羊一共进行了n次操作(2<=n<=1000000)
第二行至第n+1行每行表示一个懒羊羊的操作,当这行形式为单独一个字符‘q’时,表示懒羊羊肚子饿了,要吃掉仓库里当前数量最少的那份青草;当这行形式为一个字符‘ i’和一个整数k时,表示懒羊羊将一份数量为k(1<=k<=2147483647)的青草存入了仓库,‘ i’和k之间用空格隔开。
输入数据保证每次询问时仓库里都有草可吃且所有操作中懒羊羊至少会吃一次草。

输出

每当输入为‘q’时,输出懒羊羊当前吃掉的那份青草的数量是多少。

样例输入 Copy

5 i 5 i 2 q i 9 q

样例输出 Copy

2 5

提示

30%数据满足1<=n<=3000;
60%数据满足1<=n<=40000;
100%数据满足1<=n<=1000000.

优先队列

代码

#include <iostream>
#include <queue>
using namespace std;
int main()
{
    int n,m;
    char ch;
    priority_queue<int,vector<int>,greater<int>> q;//小顶堆
    cin>>n;
    while(n--)
    {
        cin>>ch;
        if(ch=='i') {scanf("%d",&m);q.push(m);}
        else {printf("%d\n",q.top());q.pop();}
    }
    return 0;
}

优先队列的时间复杂度为O(logn),n为队列中元素的个数

priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:

priority_queue<Type, Container, Functional>     其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.STL里面默认用的是 vector.

比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大。(也就是默认非升序)

升序队列 priority_queue <int,vector<int>,greater<int> > q          //小顶堆

降序队列 priority_queue <int,vector<int>,less<int> >q               //大顶堆

greater和less是std实现的两个仿函数