堆/题解 P3378 【【模板】堆】
概念:
堆就是一颗二叉树,满足父亲节点总是比儿子节点大(小)。因此,堆也分为大根堆和小根堆,大根堆就是父亲节点比儿子节点大,小根堆正好相反。注意加粗的地方,是每一个节点哦!!!!!
还是直接看例题吧,这样讲起来更加生动。
上题:【模板】堆
解析:
这道题明显就是一个小根堆,那,怎么实现呢?热爱数组的我选择了数组实现明明就是指针不会。
操作1:添加一个数字
这里需要用到两个函数,一个insert函数,用来插入,一个ufix函数,用来更新。
void ufix(int i){
	if(i <= 1) return;	//如果都到根了,退出
	if(h[i] < h[i / 2]){	//向上比较
		swap(h[i] , h[i / 2]);
		ufix(i / 2);
	}
}
void insert(int x){
	h[++tot] = x;	//在末尾加上这个数,然后进行更新
	ufix(tot);	//对这个点进行更新
}
操作2:输出最小的数字(也就是堆顶)
直接输出堆顶就行了qwq。
if(x == 2) cout << h[1] << endl;
操作3:删除最小的数字(也就是堆顶)
这里也需要两个函数,一个delet函数,用来删除,一个dfix函数,用来更新。
void dfix(int i){
	if(h[i] == 0x3fffffff) return;	//如果已经越界了,就直接退出
	int k;
	if(h[i * 2] < h[i * 2 + 1]) k = i * 2;	//比较左右儿子谁更优
	else k = i * 2 + 1;
	if(h[i] > h[k]){	//看自己是否需要更新
		swap(h[i] , h[k]);
		dfix(k);
	}
}
void delet(){
	swap(h[1] , h[tot]);
	h[tot--] = 0x3fffffff;	//删除
	dfix(1);
}
完整代码
#include <bits/stdc++.h>
using namespace std;
int n , tot = 0;
int h[1000010];
void ufix(int i){
	if(i <= 1) return;
	if(h[i] < h[i / 2]){
		swap(h[i] , h[i / 2]);
		ufix(i / 2);
	}
}
void dfix(int i){
	if(h[i] == 0x3fffffff) return;
	int k;
	if(h[i * 2] < h[i * 2 + 1]) k = i * 2;
	else k = i * 2 + 1;
	if(h[i] > h[k]){
		swap(h[i] , h[k]);
		dfix(k);
	}
}
void insert(int x){
	h[++tot] = x;
	ufix(tot);
}
void delet(){
	swap(h[1] , h[tot]);
	h[tot--] = 0x3fffffff;
	dfix(1);
}
int main(){
	cin >> n;
	fill(h + 1 , h + 1000010 + 1 , 0x3fffffff);
	while(n--){
		int x;
		cin >> x;
		if(x == 1){
			cin >> x;
			insert(x);
		}else if(x == 2) cout << h[1] << endl;
		else delet();
	}
	return 0;
}
其实优先队列可以直接A的(其内部就是堆实现嘛),但是自己手写一遍可以加深理解哦。
堆/题解 P3378 【【模板】堆】的更多相关文章
- 最短路模板|堆优化Dijkstra,SPFA,floyd
		
Ⅰ:Dijkstra单源点最短路 1.1Dijkstra const int MAX_N = 10000; const int MAX_M = 100000; const int inf = 0x3f ...
 - luogu P1552 [APIO2012]派遣 题解--可并堆/贪心
		
题目链接: https://www.luogu.org/problemnew/show/P1552 分析: 一开始愣是没看懂题,后面发现就是你要找一个树上点集使得各点权值之和小于\(M\),并且找一个 ...
 - 堆排序(大顶堆、小顶堆)----C语言
		
堆排序 之前的随笔写了栈(顺序栈.链式栈).队列(循环队列.链式队列).链表.二叉树,这次随笔来写堆 1.什么是堆? 堆是一种非线性结构,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被 ...
 - 【转载】java项目中经常碰到的内存溢出问题: java.lang.OutOfMemoryError: PermGen space,  堆内存和非堆内存,写的很好,理解很方便
		
Tomcat Xms Xmx PermSize MaxPermSize 区别 及 java.lang.OutOfMemoryError: PermGen space 解决 解决方案 在 catalin ...
 - 干货:JVM 堆内存和非堆内存
		
堆和非堆内存 按照官方的说法:"Java 虚拟机具有一个堆(Heap),堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时创建的."" ...
 - JVM 堆内存和非堆内存
		
转载自:http://www.importnew.com/27645.html 堆和非堆内存 按照官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据区域,所有类实例和数组的内存均从此 ...
 - Java基础-Java中的堆内存和离堆内存机制
		
Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
 - 结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆、斜堆
		
实现优先队列结构主要是通过堆完成,主要有:二叉堆.d堆.左式堆.斜堆.二项堆.斐波那契堆.pairing 堆等. 1. 二叉堆 1.1. 定义 完全二叉树,根最小. 存储时使用层序. 1.2. 操作 ...
 - hdu5795 A Simple Nim   求nim求法,打表找sg值规律 给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作可以选择任意一堆取走任意个石子(不可以为空) 或者选择一堆,把它分成三堆,每堆不为空。求先手必胜,还是后手必胜。
		
/** 题目:A Simple Nim 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5795 题意:给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作 ...
 
随机推荐
- Java实现蓝桥杯历届试题买不到的数目
			
历届试题 买不到的数目 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友 ...
 - Java实现 蓝桥杯 一步之遥
			
一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的面前是两个按钮,分别写着"F"和"B". 小明突然记起来,这两个 ...
 - java实现第七届蓝桥杯凑算式
			
凑算式 凑算式 B DEF A + - + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中AI代表19的数字,不同的字母代表不同的数字. 比如: 6+8 ...
 - FT-8900, 8800,7800 , FT-897, 857 e 817 连接中继板接线图
			
FT-8900, 8800,7800 , FT-897, 857 e 817 等 车台支持Moto GM950i GM300(只适合接收) GM3688等
 - Java基础(十一)
			
一.连接到服务器 telnet是一种用于网络编程的非常强大的测试工具,你可以在命令shell中输入telnet来启动它. 二.实现服务器 服务器循环体: 1.通过输入数据流从客户端接收一个命令. 2. ...
 - Java基础(九)
			
一.总述 多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务.通常,每一个任务称为一个线程,它是线程控制的简称.可以同时运行一个以上线程的程序称为多线程程序. 多进程与多线程的区别: ...
 - KVM虚拟机使用NAT+iptables做端口映射
			
环境介绍 有一个KVM宿主机,一个外网IP绑定在了宿主服务器上,但是希望直接用ssh访问上面的所有虚拟机,还想虚拟机提供外网服务, 解决方法如下: 环境为RHEL6.3,外网IP为 61.155.xx ...
 - @Component、@Service、@Controller、@Rrepository说明
			
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1 Spring容 ...
 - Redis   PHP扩展安装步骤
			
### 下载最新的扩展文件,解压并进入文件夹 wget https://codeload.github.com/phpredis/phpredis/tar.gz/2.2.7 tar -zxvf 2.2 ...
 - 如何修改centOS7的GUI图形界面
			
在安装Gnome包之前,需要检查一下安装源(yum)是否正常,因为需要在yum命令来安装gnome包. 第一步:先检查yum 是否安装了,以及网络是否有网络.如果这两者都没有,先解决网络,在解决yum ...