对于stl priority_queue ,我们自己定义的类自己重载<,对于非自定义类我们默认大根堆,如若改成小根堆则写成std::priority<int,vector<int>,greator<int> >。时间复杂度除了pop push是O(log)外都是O(1)。
当然手打会比stl快不少,下面介绍手打堆。
对于手打堆他出来用于优先队列之外还能用于堆排序,就先建堆,然后依次取出。除已有操作以外,还有一个建堆过程,一般用于堆排序,就是一次把许多数的建成堆,就是先按原顺序建树,从(len>>1)(第一个不是叶子节点的点)开始向前走,对每一个点进行down()操作。其他的操作同。然而我们手打堆可以进行一些操作来使他可以删除堆中任意一点。一般删除堆中元素,有三种办法,一是打标记,二是用垃圾堆,三是手打堆直接删除。

#include <cstdio>
#include <cstring>
#include <algorithm>
namespace Heap{
const int N=;
const int Inf=0x3f3f3f3f;
int key[N],len;
inline void Init(){
key[]=-Inf;
}
inline bool empty(){
return len==;
}
inline int top(){
return key[];
}
inline void push(int val){
key[++len]=val;int now=len;
while(key[now]<key[now>>])
std::swap(key[now],key[now>>]),now=now>>;
}
inline void pop(){
key[]=key[len--];int now=;
while(now<=(len>>)){
int next=now<<;
if(next<len&&key[next]>key[next|])++next;
if(key[next]>=key[now])break;
std::swap(key[next],key[now]),now=next;
}
}
}
int n;
long long ans;
int main(){
scanf("%d",&n),Heap::Init();
for(int i=,x;i<=n;++i)
scanf("%d",&x),Heap::push(x);
for(int i=,x,y;i<n;++i)
x=Heap::top(),Heap::pop(),y=Heap::top(),Heap::pop(),ans+=x+y,Heap::push(x+y);
printf("%lld",ans);
return ;
}

最新文章

  1. 连做两场goodbye2016是怎样的体验.....
  2. 图的邻接多重表和搜索(C++版本)
  3. iOS-数据持久化-第三方框架FMDB的使用
  4. Bootstrap &ndash; 1.认识
  5. 查找SAP标准程序用户出口及BADI的方法
  6. Python 3.X 实现定时器 Timer,制作抽象的Timer定时器基类
  7. jsoup html采集器
  8. Win7 桌面应用图标不见了
  9. 金蝶BOS
  10. 【M32】在未来时态下发展程序
  11. Java开源内容管理CMS系统J4CMS支持静态化直接ftp上传到你的空间了
  12. Objective-C内存管理与原理
  13. JAVA面向对象3---多态
  14. 我是如何让minio client上传速度提高几十倍的
  15. 使用R的注意事项
  16. Java知识回顾 (8) 集合
  17. python locust 性能测试:locust参数-保证并发测试数据唯一性,循环取数据
  18. 手动封装on,emit,off
  19. Python urllib Request 用法
  20. 【教程】手写简易web服务器

热门文章

  1. SSM框架搭建步骤
  2. Source Insight的使用
  3. Python学习第二弹
  4. STL——vector和list
  5. Linux安装防火墙
  6. 使用PSSH批量操作Linux服务器
  7. Struts2(五.用户注册的实现及整合Action的配置方法)
  8. Paper Reading - Show and Tell: Lessons learned from the 2015 MSCOCO Image Captioning Challenge
  9. Python登录小程序
  10. python——pyinstaller生成exe基本使用和遇到的坑