P3378 【模板】堆 ( 手写 / stl )

题解:洛谷 P3378 【模板】堆 等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。行,每行表示一次操作。对于每个操作 2,输出一行一个整数表示答案。第一行是一个整数,表示操作的次数。本文分享的必刷题目是从。#普及# #堆排序# 阅读详情
题目链接:点击进入
题目

在这里插入图片描述
在这里插入图片描述

思路 ( 手写堆 )

手写最小堆。

插入 x :将 x 插入到最后一个节点处,将 x 不断与它的父节点比较,x 比父节点小就 swap 上浮一下,继续比较,否则就 break 结束。

删除:删掉第一个点,将最后一个节点 x 放在第一个节点上,节点数-- ,然后将 x 不断与它的两个孩子中小的那个比较,x 比小的孩子大就 swap 下沉一下,继续比较,否则 break 结束

输出最小值:第一个节点 ( 堆顶 ) 的值就是最小值。

代码 ( 手写堆 )
// Problem: P3378 【模板】堆
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3378
// Memory Limit: 512 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//#pragma GCC optimize(3)//O3
//#pragma GCC optimize(2)//O2
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define base 233 
#define pb push_back
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define lowbit(x) x & -x
#define inf 0x3f3f3f3f
//#define int long long
//#define double long double
//#define rep(i,x,y) for(register int i = x; i <= y;++i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double pai=acos(-1.0);
const int maxn=1e6+10;
const int mod=1e9+7;
const double eps=1e-9;
const int N=5e3+10;
/*--------------------------------------------*/
inline int read()
{
    int k = 0, f = 1 ;
    char c = getchar() ;
    while(!isdigit(c)){if(c == '-') f = -1 ;c = getchar() ;}
    while(isdigit(c)) k = (k << 1) + (k << 3) + c - 48 ,c = getchar() ;
    return k * f ;
}
/*--------------------------------------------*/

int t,a[maxn],cnt;

void insert(int x)
{
	a[++cnt]=x;
	int pos=cnt;
	while(pos)
	{
		int fa=pos/2;
		if(a[fa]>a[pos]) swap(a[fa],a[pos]);
		else break;
		pos=fa;
	}
}
void del()
{
	swap(a[cnt],a[1]);
	cnt--;
	int pos=1;
	while((pos*2)<=cnt)
	{
		int ch=pos*2;
		if(ch+1<=cnt&&a[ch]>a[ch+1]) ch++;
		if(a[pos]>a[ch]) swap(a[pos],a[ch]);
		else break;
		pos=ch;
	}
}

int main() 
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);cout.tie(0);	
	cin>>t;
	while(t--)
	{
		int op,x;
		cin>>op;
		if(op==1)
		{
			cin>>x;
			insert(x);
		}
		else if(op==2)
			cout<<a[1]<<endl;
		else if(op==3)
			del();
	}
    return 0;
} 
思路 ( stl 优先队列 )

//升序队列,小顶堆
priority_queue < int , vector < int > , greater < int > > q;
//降序队列,大顶堆
priority_queue < int , vector < int > , less < int > >q;

代码 ( stl )
// Problem: P3378 【模板】堆
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3378
// Memory Limit: 512 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//#pragma GCC optimize(3)//O3
//#pragma GCC optimize(2)//O2
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define base 233 
#define pb push_back
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define lowbit(x) x & -x
#define inf 0x3f3f3f3f
//#define int long long
//#define double long double
//#define rep(i,x,y) for(register int i = x; i <= y;++i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double pai=acos(-1.0);
const int maxn=1e6+10;
const int mod=1e9+7;
const double eps=1e-9;
const int N=5e3+10;
/*--------------------------------------------*/
inline int read()
{
    int k = 0, f = 1 ;
    char c = getchar() ;
    while(!isdigit(c)){if(c == '-') f = -1 ;c = getchar() ;}
    while(isdigit(c)) k = (k << 1) + (k << 3) + c - 48 ,c = getchar() ;
    return k * f ;
}
/*--------------------------------------------*/

int t;
priority_queue<int,vector<int>,greater<int>>q;

int main() 
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);cout.tie(0);	
	cin>>t;
	while(t--)
	{
		int op,x;
		cin>>op;
		if(op==1)
		{
			cin>>x;
			q.push(x);
		}
		else if(op==2)
			cout<<q.top()<<endl;
		else if(op==3)
			q.pop();
	}
    return 0;
} 
二叉堆最小堆的Java实现 个人实现的最小权重的二叉堆实现,效率很高,适合任意场合下的临时列表排序。 可在外部写脚本对该文件进行测试 需要继承Tuple类实现排序对象类型,并实现Tuple的抽象方法weight()来反映排序对象权重 立即下载

相关推荐

GraphRAG 踩坑记录

GraphRAG踩坑记录

yufanwenshu的博客 4350

leetcode215. 数组中的第K个最大元素(手写最小堆)

题目 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 题解 本体采用最小堆的思路,限制堆的大小为k,不断地填入数据,替换堆顶,重构堆结构,所有数据处理完后,堆顶就是第k大的结果 class Solution { p

gary101818的博客 303

EastWave应用案例:机箱屏蔽效能仿真

如何使用EastWave对机箱的电磁屏蔽效能进行仿真

2201_76034687的博客 1392

【C++】手写堆

堆使用数组存储,下标从1开始(下标从0开始也可以)。下标为u2 * u2 * i + 12 * u + 12 * i + 1u / 2。

m0_62327743的博客 648

CXL Virtual Hierarchy (VH) Enumeration理解

在 CXL 3.0 协议中,CXL Virtual Hierarchy (VH) Enumeration 是一种针对 CXL 虚拟层级(Virtual Hierarchy) 设计的设备枚举机制,它允许软件将物理连接的 CXL 设备抽象为多个逻辑层级(虚拟层级),从而实现更灵活的资源管理和拓扑扩展。与传统的 PCIe 枚举相比,CXL VH 枚举在协议特性、拓扑抽象和资源分配机制上有显著差异。本质:VH 是一个逻辑上的设备层级结构,可能与物理连接拓扑不同。

Summer的博客 1001

FunASR语音识别服务在Win11上的Docker部署避坑指南:模型配置与热词优化

本文详细介绍了在Windows 11系统上通过Docker部署FunASR语音识别服务的完整流程,包括环境准备、模型配置、热词优化及常见问题解决方案。特别针对Win11环境下的特殊配置和性能调优提供了实用指南,帮助开发者高效搭建高性能语音识别服务。

e3f4g5的博客 222

堆(手写小根堆)

若一棵二叉树至多只有最下面两层的结点的度数可以小于2,并且最下层的结点都集中在该层最左边的若干位置上,则此二叉树为完全二叉树。将节点上(up函数)下(down函数)移动,保证每个节点都小于等于左、右儿子,根节点为整个数据结构的最小值。此外,操作down()和up()都跟堆的层数有管,故这两种操作的时间复杂度都为O(logn)。(1)小根堆:每个点都小于等于左、右儿子,根节点为整个数据结构的最小值。(2)大根堆:每个点都大于等于左、右儿子,根节点为整个数据结构的最大值。第二行包含 n 个整数,表示整数数列。

m0_74381212的博客 1176

Nvidia Tesla A100 驱动安装方法

Nvidia Tesla A100 驱动安装方法 遇到的问题:以前安装tesla系列、geforce系列等gpu 驱动的时候,只需执行nvidiaxxxx.run驱动包或者安装nvidiaxxxx.rpm包即可,但遇到新的GPU Nvidia Tesla A100的时候,安装完驱动似乎不起作用,找了半天资料,原来需要以下步骤才可以使用;

qq_24343177的博客 2万+

堆排序【手写小根堆】

堆排序,小根堆,大根堆,完全二叉树,向下调整,向上调整,down,up 堆是一个高效的优先级队列,我们可以把堆看做一棵完全二叉树的数组。 性质:根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。 将要排序的所有值放到一棵完全二叉树的各个结点中,这时候的二叉树不用具备堆的性质,利用up或者down操作来调整堆。在堆的创建过程中,我们需要加入两个操作:为什么是从最后一个非叶子节点开始down呢?...

c__chong的博客 3618

PE启动盘结合360杀毒离线版:深度清除顽固病毒实战指南

在系统安全维护领域,离线查杀是一种在独立于宿主操作系统的环境下进行病毒扫描和清除的核心技术。其原理是通过一个预启动环境(如PE)加载杀毒软件,从而绕过可能已被感染或受保护的系统核心,直接访问和扫描磁盘文件。这项技术的核心价值在于能够彻底处理那些在正常系统运行时难以清除的深度隐藏病毒、Rootkit和驱动级木马。典型的应用场景包括应对勒索软件、顽固感染型病毒以及系统启动项被劫持等情况。本文以“PE启动盘”和“360杀毒离线版”这一经典组合为例,详细解析了从工具选型、环境部署到深度查杀策略的全流程,为系统维护人

weixin_29741447的博客 408

基于 MATLAB 的综合能源系统建模:全面解析与案例应用 

本文详细介绍了基于 MATLAB 的综合能源系统建模相关知识,包括 MATLAB 在综合能源建模中的优势、综合能源系统各组件和网络的建模方法,并通过园区综合能源系统的案例展示了从建模到优化调度求解以及结果分析的全过程。在当今全球能源格局深刻变革的背景下,综合能源系统(Integrated Energy System,IES)作为一种创新的能源供应体系,整合了多种能源形式,如电力、热力、燃气等,以实现能源的高效生产、传输、分配和利用。需要考虑燃气的压力、流量特性以及管道的阻力特性等。

qq_57128262的博客 1335

手写最小堆

下面是一个完整的C++实现手写最小堆的代码。最小堆是一种完全二叉树,其中每个节点的值都小于或等于其子节点的值。

chenmi123321的博客 344

Multi-Agent

Multi-Agent System(MAS,多代理系统)是分布式人工智能(DAI)领域皇冠上的明珠,其核心思想是通过多个自主、交互、目标导向的智能体(Agent)的协同与竞争,解决单智能体无法或难以高效处理的复杂问题——包括大规模资源调度、多模态数据理解与决策、复杂软件架构的自治运维、甚至未来城市级的交通与能源管理。本文将以结构化分析推理和第一性原理思考。

AI智能探索者的博客 407

洛谷 P3378 【模板】堆 STL优先队列实现二叉堆/手写二叉堆 C/C++

题目描述 给定一个数列,初始为空,请支持下面三种操作: 给定一个整数x,请将x加入到数列中。 输出数列中最小的数。 删除数列中最小的数(如果有多个数最小,只删除1个)。 输入格式 第一行是一个整数,表示操作的次数n。 接下来nn行,每行表示一次操作。每行首先有一个整数op表示操作类型。 若op=1,则后面有一个整数x,表示要将x加入数列。 若op=2,则表示要求输出数列中的最小数。 若op=3,则表示删除数列中的最小数。如果有多个数最小,只删除1个。 输出...

Prudento的博客 1521

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

洛谷 P3378 【模板】堆

洛谷 P3378 【模板】堆 洛谷传送门 题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入格式 第一行包含一个整数N,表示操作的个数 接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下: 操作1: 1 x 操作2: 2 操作3: 3 输出格式 包含若...

anhaoti3785的博客 178

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

洛谷 P3378:[模板] 堆 ← 二叉堆

为什么大家常说 “priority_queue 就是堆”? 在 C++ 日常开发 / 算法题中,99% 的场景只需要普通二叉堆(大根 / 小根堆),而 priority_queue刚好完美封装了普通二叉堆的所有核心操作。

hnjzsyjyj的专栏 1004

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

P3378 【模板】堆

【代码】P3378 【模板】堆。

xxyrcgtzbh554488的博客 1001

每日一题007-堆-洛谷p3378堆模版题

给定一个数列,初始为空,请支持下面三种操作:第一行是一个整数,表示操作的次数 nnn。 接下来 nnn 行,每行表示一次操作。每行首先有一个整数 opopop 表示操作类型。对于每个操作 222,输出一行一个整数表示答案。 输出 #1 说明/提示 【数据规模与约定】写一个小根堆的模版即可,也可以使用stl中的priority_queue,代码写起来更快。

zjh的博客 1103

P3378 【模板】堆题解

自己骗不了自己的,不要抄袭,数据结构要好好练!!!

laobaandre的博客 217

【luogu P3378 堆】 模板

题目链接:https://www.luogu.org/problemnew/show/P3378 是堆的模板...我懒,STL da fa is good #include <iostream> #include <cstdio> #include <queue> #include <algorithm> using nam...

98

堆 P3378 【模板】堆

这个堆是边插入边操作的 和全部给出那种变成堆是有区别的 #include<bits/stdc++.h> using namespace std; const int N=1e6+10; int head[N]; int sz; void push(int x) { head[++sz]=x;//先插入到最新叶节点 int now=sz; while(now){ int ...

Insistor 374
上一篇: P4779 【模板】单源最短路径(标准版)( dijkstra )
下一篇: P3379 -【模板】最近公共祖先(LCA)
Cosmic_Tree
博客等级 码龄7年 134粉丝 337原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值