博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ 1724】[Usaco2006 Nov]Fence Repair 切割木板 堆+贪心
阅读量:5251 次
发布时间:2019-06-14

本文共 1246 字,大约阅读时间需要 4 分钟。

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

#include 
#include
#include
namespace Heap{ const int N=20010; const int Inf=0x3f3f3f3f; int key[N],len; inline void Init(){ key[0]=-Inf; } inline bool empty(){ return len==0; } inline int top(){ return key[1]; } inline void push(int val){ key[++len]=val;int now=len; while(key[now]
>1]) std::swap(key[now],key[now>>1]),now=now>>1; } inline void pop(){ key[1]=key[len--];int now=1; while(now<=(len>>1)){ int next=now<<1; if(next
key[next|1])++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=1,x;i<=n;++i) scanf("%d",&x),Heap::push(x); for(int i=1,x,y;i

 

转载于:https://www.cnblogs.com/TSHugh/p/7598792.html

你可能感兴趣的文章
Java实现二分查找
查看>>
php7 新特性整理
查看>>
RabbitMQ、Redis、Memcache、SQLAlchemy
查看>>
03 线程池
查看>>
手机验证码执行流程
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>
jquery的contains方法
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
桥接模式-Bridge(Java实现)
查看>>
303. Range Sum Query - Immutable
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
前台freemark获取后台的值
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
Django 相关
查看>>
Python(软件目录结构规范)
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>