Luogu P3378 【模板】堆
堆是一个完全二叉树,对于小根堆,所有父节点<=子节点,下标就和线段树是一样的
在STL里就是优先队列
只有堆顶元素可以操作(询问或弹出)。
加入新元素时x,heap[++size] = x,下标t=size;
每次比较它和父节点(t/2)的大小,如果它较小就swap。
删除堆顶元素时,用最后一个元素heap[size--]覆盖heap[1],下标t=1;
每次比较它和左右两个儿子的大小,和较小的swap。
注意:
- 下标t的值不能大于堆的size;
- 我一开始是这么写的:
void del() {
swap(heap[],heap[cnt--]);
int t = ;
while(t* <= cnt && (heap[t] > heap[t*] || heap[t] > heap[t*+])) {
if(heap[t*+] < heap[t*] && t*+ <= cnt) {
swap(heap[t],heap[t*+]);
t = t*+;
} else {
swap(heap[t],heap[t*]);
t *= ;
}
}
}把swap(heap[1],heap[cnt--])改为heap[1] = heap[cnt--]就对了
- 如果把最小的数x放到了下面,将最后一个数y从堆顶下移,判断到x的父亲时,一定有x<=y。因为判断是否交换时的条件是左右儿子有一个>y就继续循环,虽然此时判断x的下标>size,但是会默认和另一个儿子交换。
- 如果最后一个值是空的时(为0)就更会翻车了!所以边界条件还是分别判断,这样swap也没问题啦。
代码如下
#include<cstdio>
#include<iostream> using namespace std;
const int maxn = ;
int heap[maxn],n,a,b,cnt; void insert(int x) {
heap[++cnt] = x;
int t = cnt;
while(heap[t] < heap[t/]) {
swap(heap[t],heap[t/]);
t/=;
}
} void del() {
heap[] = heap[cnt--];
int t = ;
while((t* <= cnt && heap[t] > heap[t*]) || (t*+ <= cnt && heap[t] > heap[t*+])) {
if(heap[t*+] < heap[t*] && t*+ <= cnt) {
swap(heap[t],heap[t*+]);
t = t*+;
} else {
swap(heap[t],heap[t*]);
t *= ;
}
}
} int main() {
scanf("%d",&n);
for(int i = ; i <= n; i++) {
scanf("%d",&a);
if(a == ) {
scanf("%d",&b);
insert(b);
}
if(a == ) {
if(cnt)printf("%d\n",heap[]);
}
if(a == ) {
del();
}
}
return ;
}
Luogu P3378 【模板】堆的更多相关文章
- 【luogu P3378 堆】 模板
题目链接:https://www.luogu.org/problemnew/show/P3378 是堆的模板...我懒,STL da fa is good #include <iostream& ...
- [luogu P3384] [模板]树链剖分
[luogu P3384] [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点 ...
- Luogu P2742 模板-二维凸包
Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...
- luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)
luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...
- 最短路模板|堆优化Dijkstra,SPFA,floyd
Ⅰ:Dijkstra单源点最短路 1.1Dijkstra const int MAX_N = 10000; const int MAX_M = 100000; const int inf = 0x3f ...
- Luogu [P3367] 模板 并查集
[模板]并查集 题目详见:[[P3367][模板]并查集] (https://www.luogu.org/problemnew/show/P3367) 这是一道裸的并查集题目(要不然叫模板呢) 废话不 ...
- [luogu]P1168 中位数[堆]
[luogu]P1168 中位数 题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1 ...
- Luogu P3381 (模板题) 最小费用最大流
<题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...
- 51: Luogu 2485 模板
$des$ 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给定y.z.p,计算满足y^x ≡z(mod p)的最小非负 ...
随机推荐
- js替换字符中的斜杠反斜杠
var reg=/\\|\//g; var a="a\a\\a/b" alert(a.replace(reg,"-"));
- FUNCTIONALITY OF ITEM CATEGORY
Item Category Purpose This wiki page will breify discuss about functionality of Item Category in SAP ...
- python 爬虫爬取内容时, \xa0 、 \u3000 的含义
最近用 scrapy 爬某网站,发现拿到的内容里面含有 \xa0 . \u3000 这样的字符,起初还以为是编码不对,搜了一下才知道是见识太少 233 . \xa0 是不间断空白符 我们通常所用的 ...
- 系统调用fork()在powerpc上的源码分析
总结一句话:系统调用的本质,通过sc指令触发异常,完成用户态到内核的转换. 展开一些:应用程序调用fork(),fork()是一个glibc函数,该函数的最底层调用sc指令,触发cpu异常,从而完成从 ...
- Linux技术图谱
- (网页)HTMl5的sessionStorage和localStorage
百度上百度的,记录一下: html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage. sessionStorage用于本地存储一个会话(sessi ...
- 《高性能JavaScript》--读书笔记
第一章 加载和运行 延迟脚本 defer 该属性表明脚本在执行期间不会影响到页面的构造,脚本会先下载但被延迟到整个页面都解析完毕后再运行.只适用于外部脚本 <script src="j ...
- 如何用fiddler + 手机设置无线代理 下载只有 手机才能访问的资源。
我主要用来获取,一些特定的API,研究学习. 责任声明: 如果你用来违法犯罪,与我无关. 1.使电脑成为代理服务器 架代理服务器的软件有很多,自己百度一下.也可以用现成的代理软件.(其实Fiddler ...
- MySQL 系列(四) 主从复制、读写分离、模拟宕机、备份恢复方案生产环境实战
本章内容: 主从复制 简介原理 备份主库及恢复从库,配置从库生效 读写分离 如果主宕机了,怎么办? 双主的情况 MySQL 备份及恢复方案 备份单个及多个数据库 mysqldump 的常用参数 如何增 ...
- node.js cluster模式启用方式
众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心处理器 ...