【模板】堆

news/2024/11/29 0:36:24/文章来源:https://www.cnblogs.com/gailixia/p/18575502

【模板】堆

题目描述

给定一个数列,初始为空,请支持下面三种操作:

  1. 给定一个整数 \(x\),请将 \(x\) 加入到数列中。
  2. 输出数列中最小的数。
  3. 删除数列中最小的数(如果有多个数最小,只删除 \(1\) 个)。

输入格式

第一行是一个整数,表示操作的次数 \(n\)
接下来 \(n\) 行,每行表示一次操作。每行首先有一个整数 \(op\) 表示操作类型。

  • \(op = 1\),则后面有一个整数 \(x\),表示要将 \(x\) 加入数列。
  • \(op = 2\),则表示要求输出数列中的最小数。
  • \(op = 3\),则表示删除数列中的最小数。如果有多个数最小,只删除 \(1\) 个。

输出格式

对于每个操作 \(2\),输出一行一个整数表示答案。

样例输入

5
1 2
1 5
2
3
2

样例输出

2
5

提示

  • 对于 \(30\%\) 的数据,保证 \(n \leq 15\)
  • 对于 \(70\%\) 的数据,保证 \(n \leq 10^4\)
  • 对于 \(100\%\) 的数据,保证 \(1 \leq n \leq 10^6\)\(1 \leq x \lt 2^{31}\)\(op \in \{1, 2, 3\}\)

[!TIP]

最小堆(堆顶(根节点)的值是最小的)

//在down函数里把大小于号一改应该就变成了最大堆→堆顶(根节点)的值是最大的
int max = x;if (l < len && heap[l] > heap[max]) { max = l;}if (r < len && heap[r] > heap[max]) { max = r;}if (max != x) {swap(heap[max], heap[x]);down(max); }




用时 内存
588ms 2.25MB
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;int heap[N], baka, op, x, l, r , min;//heap存储堆中元素
//从下往上调整堆(从x节点往根找,如果不符合小根堆的性质,交换父子节点)
void up(int x) {if (x == 0) return; //如果已经是根节点直接返回int fa = (x - 1) / 2;//父节点的索引if (heap[fa] > heap[x]) {//只要存在父亲,而且不满足堆的性质,交换父子swap(heap[fa], heap[x]);up(fa); //调整父节点}
}
// 上往下调整堆
void down(int x) {int len = baka;//堆的当前长度if (x * 2 + 1 >= len) return; //没有子节点直接返回l = 2 * x + 1;//左索引r = 2 * x + 2;//右索引int min = x; if (l < len && heap[l] < heap[min]) {min = l;}if (r < len && heap[r] < heap[min]) {min = r;}if (min != x) {swap(heap[min], heap[x]);down(min); //调整最小值节点}
}
//加入
void in(int x) {heap[baka] = x; //将新元素加到数组末尾up(baka); //从新插入元素的位置开始向上调整baka-=-1;
}
//删除最小
void out() {if (baka > 0) {//堆不空heap[0] = heap[baka - 1]; //将最后一个元素移动到堆顶baka--; down(0); //调整堆}
}
//最小元素
int top() {return heap[0]; //返回堆顶元素(最小值)
}int main() {int n;scanf("%d", &n);for (int i = 1; i <= n; i-=-1) {scanf("%d", &op);if (op == 1) {scanf("%d", &x);in(x); //加入} else if (op == 2) {if (baka > 0) {printf("%d\n", top()); //输出堆顶元素(最小值)}} else if (op == 3) {if (baka > 0) {out(); //删除堆顶元素(最小值)}}}return 0;
}

[!TIP]

STL

用时 内存
597ms 2.54MB
#include <bits/stdc++.h>
using namespace std;priority_queue<int, vector<int>, greater<int>> q; //定义最小堆
int main()
{int n, op, x;scanf("%d", &n);for (int i = 1 ; i <= n; ++i) {scanf("%d", &op); if (op == 1) {scanf("%d", &x); q.push(x); //插入元素} else if (op == 2) {printf("%d\n", q.top()); //输出堆顶元素(最小值)} else if (op == 3) {q.pop(); //删除堆顶元素(最小值)}}return 0;
}






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843174.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FIFO 缓存算法很简单,但也可以聊挺久

作者:秦怀 1 简介 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决,这句话就是整个计算机软件以及系统设计中的核心思想,而缓存对这一思想的一种实践。 缓存,总归会受到存储空间的限制,当缓存的空间不足的时候,如果在保持一定系统文档的情况下,还能兼顾到…

安装在C盘的软件移到其它盘

移动Office到D盘为例,Office默认安装位置为"C:Program FilesMicrosoft Office",只需要把“Microsoft Office”这个目录移动到C盘以外的盘符,我们这里以D盘为例。1)在D盘新建一个文件夹“Program Files”,然后按“Shift键不放,点重启电脑”进入安全模式;2)在安…

HCIP-01 RSTP原理与配置

生成树是一个用于局域网中消除环路的协议。运行该协议的设备通过彼此交互信息而发现网络中的环路,并对某些接口进行阻塞以消除环路。由于局域网规模的不断增长,生成树协议已经成为重要的局域网协议之一。 RSTP是生成树协议中的其中一个版本,它在STP的基础上,做了很多的改进…

Ripro V5日主题 v8.3 开心授权版 wordpress主题虚拟资源下载站首选主题模板

简介: RiPro主题全新V5版本,是一个优秀且功能强大、易于管理、现代化的WordPress虚拟资源商城主题。支持首页模块化布局和WP原生小工具模块化首页可拖拽设置,让您的网站设计体验更加舒适。同时支持了高级筛选、自带会员生态系统、超全支付接口等众多功能,无需依赖插件即可实…

从“三好”到“超三好”,智界新S7“卷”回来了!

11月26日,鸿蒙智行旗下智界新S7在华为Mate品牌盛典上市,并公布正式售价。智界新S7正式上市推出3款车型,智界新S7 Pro售价22.98万元,智界新S7 Max售价26.98万元起,智界新S7 Ultra售价31.98万元,首销期即刻下定,至高可享受价值35000元的权益。智界新S7将于12月1日开启交付…

yolo --- 模型训练

文件存放路径数据集标注软件pip install labelimg安装好后启动 labelimgOpen Dir:打开需要标注的图片路径 Change Save Dir:标注文件保存路径 View--->Auto Save mode:把这个勾上就不会每到下一张询问你一次按w可以显示画框的坐标十字 按D键可以切换到下一张 注意标注的标…

Linux物理内存管理

1 物理内存初始化——引导分配器memblockLinux内核启动时,先要初始化物理内存,这个阶段的作用主要是确定物理内存大小,哪些是可用的?哪些是预留的?完成这一阶段工作的是memblock引导分配器。内核启动时初始化物理内存的处理函数调用路径大概是(基于Linux 5.10.1源码查看):…

Threejs入门-灯光

在 Three.js 中,灯光是非常重要的元素之一,它能够模拟现实世界中的光照效果,帮助我们打造更加真实的三维场景。灯光的种类和配置方式可以影响整个场景的视觉效果,在不同的应用中,灯光的使用非常关键。 灯光概述 Three.js 提供了几种常见的光源类型:环境光(Ambient Light…

《Django 5 By Example》阅读笔记:p383-p387

《Django 5 By Example》学习第 14 天,p383-p387 总结,总计 5 页。 一、技术总结 1. asynchronous task(异步任务) 对于异步任务,书中使用的是 celery 和 RabbitMQ,这也是平时工作中的主流用法。 (1) celery Python 使用的 celery 包的名字也是 celery。 2. RabbitMQ (1) 拉…

思维模型:六顶思考帽,从不同角度思考问题,提升思维认知

思维模型:六顶思考帽思维模型,从不同角度思考分析问题,提升思维认知介绍 六顶思考帽(Six Thinking hats) ,由爱德华德博诺博士提出的一种思维认知模型工具。 它是通过不同颜色的帽子来代表六种不同的思维方式,帮助人们从多个角度全面分析和解决问题,提升认知。这六种颜…

12.SpringCloudAlibabaSentinel实现熔断和限流

1.Sentinel 1.1 官网 sentinel官网,类似Spring Cloud Circuit Breaker。 1.2 是什么 面向分布式、多语言异构化服务架构的流量治理组件。 1.3 下载地址 https://github.com/alibaba/Sentinel/releases 1.4 能干吗 Sentinel以流量为切入点,从流量控制、流量路由、熔断降级、系…

视觉多模态理解模型基础

1. 视觉多模态简介 视觉多模态一般涵盖2个要点:视觉表征 以及 视觉与自然语言的对齐(Visual Language Alignment)或融合。1.1. 视觉表征 视觉表征是指:将图像信息转化为深度学习模型可以处理的特征向量或向量序列的过程。具体来说,它包含以下2点:合理建模视觉输入特征:这…