洛谷题单指南-二叉堆与树状数组-P3378 【模板】堆

news/2024/11/5 12:50:48/文章来源:https://www.cnblogs.com/jcwy/p/18527530

原题链接:https://www.luogu.com.cn/problem/P3378

题意解读:实现二叉堆。

解题思路:

二叉堆本质上一棵完全二叉树,根节点称为堆顶,根据特性不同分为有两种:

大根堆:所有父节点的值大于子节点,根节点最大

小根堆:所有父节点的值小于子节点,根节点最小

主要作用:动态维护序列,并快速找到最大/最小值,或者查找topN的值

主要操作:插入(O(logN))、查找最大/最小值(O(logN))、删除最大/最小值(O(logN))

存储方式:用数组来模拟完全二叉树int s[N],s[i]的左子结点为s[2 * i],右子节点为s[2 * i + 1],父节点为s[i / 2]

下面介绍三种主要操作:

设初始堆中有4个元素:2、3、4、5,且为大根堆

用数组存储为s[1] = 5, s[2] = 3, s[3] = 4, s[4] = 2

插入元素:

设插入元素6,先将6放置在数组末尾,即s[5] = 6,

然后进行向上比较,s[5]=6与s[2]=3比较,不符合大根堆性质,交换元素,此时s[2]=6,s[5]=3,

继续向上比较,s[2]=6与s[1]=5比较,依然不符合大根堆性质,交换元素,此时s[2]=5,s[1]=6

查找堆顶:

直接返回s[1]

删除堆顶:

先将堆顶和末尾元素进行交换,swap(s[1], s[5])

再从堆顶进行向下比较,先看s[1]=3和子节点s[2]=5,s[3]=4,s[2]更大,因此要交换swap(s[1], s[2])

再看s[2]=3和子节点s[4]=2,符合大根堆性质,不用交换

注意不用考虑s[5]=6的元素了,因为交换到末尾意味着将其删除,数组s的长度-1即可。

100分代码:

注意此题中,要用小根堆,判断的方式有所区别而已。

#include <bits/stdc++.h>
using namespace std;const int N = 1000005;
int n, s[N], cnt;void up(int p)
{if(p / 2 < 1) return;if(s[p] < s[p / 2]){swap(s[p], s[p / 2]);up(p / 2);} 
}void down(int p)
{int left = p * 2;int right = p * 2 + 1;if(left > cnt) return;int minx = left;if(right <= cnt && s[right] < s[minx]) minx = right;if(s[minx] < s[p]) {swap(s[minx], s[p]);down(minx);}
}int main()
{cin >> n;int op, x;while(n--){cin >> op;if(op == 1){cin >> x;s[++cnt] = x;up(cnt);}else if(op == 2) cout << s[1] << endl;else if(op == 3){swap(s[1], s[cnt]);cnt--;if(cnt) down(1);} }return 0;
}

 

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

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

相关文章

冒泡排序与选择排序超详细讲解

冒泡排序与选择排序 冒泡排序 condition:输入5个数字,冒泡排序,逆序输出 #include<stdio.h> int main(){int userInput,tmp,i,j,arr[6],flag;flag = 0;for(int i=0;i<5;i++){scanf("%d",&userInput);arr[i] = userInput;}//依次输入五个数字for(int i…

【前端】六款高颜值登录页面

原创 吴旭东 无限大infinity第一款–简约风格HTML: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0">…

【前端】六款高颜值注册界面

原创 吴旭东 无限大infinity 和昨天的一样,带来了六款注册界面,可复制源码(需要定制请加微信) 第一款–简约风格HTML: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport…

硬盘开机报错是什么原因引起的

硬盘开机报错可能由多种原因引起,以下是一些常见的原因及相应的解决方法: 一、硬件连接问题 数据线松动或损坏: 外部硬盘:检查USB线是否插紧,尝试更换USB线或连接到其他USB端口。 内部硬盘:检查数据线和电源线是否牢固连接,确保没有松动。 接口灰尘或损坏: 清洁主板上的…

PHPStudy 安装tp8 php8.1.3 安装XDbug、redis扩展

1.1 下载php安装包 https://windows.php.net/download/1.2 下载的的安装包1.3 解压 解压到D:\phpstudypro\Extensions\php\php8.1.3nts1.4 修改php8.1.3的php.ini文件 将php8.1.3nts目录下的php.ini-development文件复职一份并改文件名为 php.ini 。然后可以将php.ini里面的内容…

pyspark建模(类似于dwd层),flask直接对接前端请求进行召回(类似于ads层,但是不保存)

2. Spark MLib 2.1 Spark MLib 开发环境准备 2.1.1 配置python和spark环境 安装Python环境 安装Anaconda3-5.2.0-Windows-x86_64.exe配置环境变量Anaconda_HOME E:\20241014_Soft\Anaconda3PATH %Anaconda_HOME%Scripts;%Anaconda_HOME%Library\mingw-w64\bin;%Anaconda_HOME…

征程 6E camera diag sample

01 功能概述 本文的 demo sample 主要描述当前 camera 相关外设诊断的当前状态,并提供自定义实现的方法及使用说明。 1.1 软件架构说明 本 sample 基于现已实现的 camera 诊断架构,libcam 内的外设诊断功能对外设硬件状态进行监测,并支持将故障状态发送给 MCU 处理,或通过事…

实时数仓及olap可视化构建(基于mysql,将maxwell改成seatunnel可以快速达成异构数据源实时同步)

1. OLAP可视化实现(需要提前整合版本)Linux121 Linux122 Linux123jupyter✔spark ✔ ✔ ✔python3+SuperSet3.0✔hive✔ClinckHouse✔Kafka ✔ ✔ ✔Phoenix ✔DataX ✔maxwell✔Hadoop ✔ ✔ ✔MySQL✔ZK ✔ ✔ ✔HBASE ✔ ✔ ✔1.1 安装Vmware,安装虚拟机集群 1.1.1 安装 …

AI运动小程序开发常见问题集锦二

截止到现在写博文时,我们的AI运动识别小程序插件已经迭代了23个版本,成功应用于健身、体育、体测、AR互动等场景;为了让正在集成或者计划进行功能扩展优化的用户,少走弯路、投入更少的开发资源,针对近期的咨询问题,我们又归集了一些常见问题,供大家参考。一、计时、计数…

synchronized的monitor监视器

public class T {@SneakyThrowspublic static void main(String[] args) {System.out.println("此行后加锁 monitorenter");synchronized (T.class){System.out.println("hello monitor");}System.out.println("此行前释放锁 monitorexit");}}反…

31 计算机安全

计算机安全是保护系统和数据的,完整,保密,可用 保密:有权限的人才能读取数据;泄露信息就是攻击保密性(看不看得到)---窃取信息 完整性:能够修改数据,知道密码进入操作-----------------------------------获取权限 可用性:有权限的人应该能随时访问,黑客发大量请求到…

大话USB PD快充电源功率“协商”

啥叫USB PD快充技术? USB PD快充技术就是通过USB接口对对USB设备进行快速充电的一项技术。 由于USB技术的发展,特别的USB TYPE-C接口的广泛应用,基于USB TYPE-C接口的USB PD快充技术越来越成为主流。 使用USB TYPE-C接口的技术可以给谁充电?可以给我们的手机充电 可以给笔记…