堆的定义
堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质
-
堆中某个节点的值总是不大于或不小于其父节点的值
-
堆总是一棵完全二叉树
下面是堆的图片:
我们再插入一个数0
堆的实现
由于代码实现过于麻烦,且不好调试,故此处只放STL实现的堆(其实是优先队列)
priority_queue<int> q; //队首是较大的数
priority_queue<int,vector<int>,greater<int> > q; //队首是较小的数,注意空格
或者如果想实现队首是较小的数但忘记了第二种写法,那么这里还有一种解决方案:用第一种写法,然后把负值压入该队列,取出时再取负值即可。
priority_queue<int> q;
q.push(-a);
int ans=-q.top();
q.pop();
cout<<ans<<endl;
一些常用函数
q.push(a); //插入
q.pop(); //出队
q.front(); //取队首
q.clear(); //清空
重载运算符
如果想将一个结构体放入优先队列,那么我们需要重载运算符。
struct node{
int x,y;
bool operator < (const node &m){
return x<m.x;
}
};
priority_queue<node> q;
典例
#include<bits/stdc++.h>
using namespace std;
int n,x,ans;
priority_queue<int,vector<int>,greater<int> >q;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>x,q.push(x);
while(q.size()>=2){
int a=q.top(); q.pop();
int b=q.top(); q.pop();
ans+=a+b;
q.push(a+b);
}
cout<<ans<<endl;
return 0;
}