luogu例题
关于堆我们可以写手写堆与STL。
个人比较懒所以喜欢STL
堆我们可以看作一个优先队列,而我们又知道,堆又
分为大根堆与小根堆
大根堆
就是堆顶为最大值,并且它的儿子节点都是比它要小(或者说是优先级不如父亲节点的)的
小根堆
显而易见就是与大根堆相反
而不管我们用大还是小根堆,我们都需要头文件#include<queue>
并且安利几个好用的东西
std::priority_queue<int> wa;
它可以让我们的优先队列变得降序,可用于大根堆,wa是数组名,int是数组类型。
而用于小根堆的话,我们可以用
std::priority_queue<int,vector<int>,greater<int> > wa;
这就是升序,vector可以加也可以不加,只是让它变得快一点
注意!!!:这条代码两个>>中一定要加上一个空格,不然会被识别为位运算符
几个用于堆的常用操作:
wa.push(a); //压入元素a
wa.top(); //返回此时优先级最高的元素
wa.pop(); //弹出优先级最高的元素,但不返回它的值
wa.empty(); //返回一个bool值,如果队列为空返回true,否则返回false
wa.size(); //返回队列中元素的个数
好了回到正题:
这题的AC代码,并且还可以当一个版子:
#include<queue>//必备头文件
#include<iostream>
using namespace std;
int n,m,j,k;
std::priority_queue<int,vector<int>,greater<int> >a;//定义一个堆
int main(){
cin>>n;
for (int i=1;i<=n;i++){
cin>>j;
if (j==1) {
cin>>k; a.push(k);//压入值
}
if (j==2) {
m=a.top(); cout<<m<<endl;//返回最大值
}
if (j==3) {
a.pop();//删除堆顶的值
}
}
return 0;
}
(n_n)