概念:

堆就是一颗二叉树,满足父亲节点总是比儿子节点大(小)。因此,堆也分为大根堆和小根堆,大根堆就是父亲节点比儿子节点大,小根堆正好相反。注意加粗的地方,是每一个节点哦!!!!!


还是直接看例题吧,这样讲起来更加生动。

上题:【模板】堆


解析:

这道题明显就是一个小根堆,那,怎么实现呢?热爱数组的我选择了数组实现明明就是指针不会。

操作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 【【模板】堆】的更多相关文章

  1. 最短路模板|堆优化Dijkstra,SPFA,floyd

    Ⅰ:Dijkstra单源点最短路 1.1Dijkstra const int MAX_N = 10000; const int MAX_M = 100000; const int inf = 0x3f ...

  2. luogu P1552 [APIO2012]派遣 题解--可并堆/贪心

    题目链接: https://www.luogu.org/problemnew/show/P1552 分析: 一开始愣是没看懂题,后面发现就是你要找一个树上点集使得各点权值之和小于\(M\),并且找一个 ...

  3. 堆排序(大顶堆、小顶堆)----C语言

    堆排序 之前的随笔写了栈(顺序栈.链式栈).队列(循环队列.链式队列).链表.二叉树,这次随笔来写堆 1.什么是堆? 堆是一种非线性结构,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被 ...

  4. 【转载】java项目中经常碰到的内存溢出问题: java.lang.OutOfMemoryError: PermGen space, 堆内存和非堆内存,写的很好,理解很方便

    Tomcat Xms Xmx PermSize MaxPermSize 区别 及 java.lang.OutOfMemoryError: PermGen space 解决 解决方案 在 catalin ...

  5. 干货:JVM 堆内存和非堆内存

    堆和非堆内存 按照官方的说法:"Java 虚拟机具有一个堆(Heap),堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时创建的."" ...

  6. JVM 堆内存和非堆内存

    转载自:http://www.importnew.com/27645.html 堆和非堆内存 按照官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据区域,所有类实例和数组的内存均从此 ...

  7. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  8. 结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆、斜堆

    实现优先队列结构主要是通过堆完成,主要有:二叉堆.d堆.左式堆.斜堆.二项堆.斐波那契堆.pairing 堆等. 1. 二叉堆 1.1. 定义 完全二叉树,根最小. 存储时使用层序. 1.2. 操作 ...

  9. hdu5795 A Simple Nim 求nim求法,打表找sg值规律 给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作可以选择任意一堆取走任意个石子(不可以为空) 或者选择一堆,把它分成三堆,每堆不为空。求先手必胜,还是后手必胜。

    /** 题目:A Simple Nim 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5795 题意:给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作 ...

随机推荐

  1. Java实现 蓝桥杯 算法训练 画图(暴力)

    试题 算法训练 画图 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色. 下图给出了一个画了两个矩 ...

  2. Java实现 LeetCode 696 计数二进制子串(暴力)

    696. 计数二进制子串 给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的. 重复出现的子串要计算它们出现的次数. 示例 1 ...

  3. Java实现 LeetCode 688 “马”在棋盘上的概率(DFS+记忆化搜索)

    688. "马"在棋盘上的概率 已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始.即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1). 现有 ...

  4. Java实现 蓝桥杯VIP 算法提高 Quadratic Equation

    算法提高 Quadratic Equation 时间限制:1.0s 内存限制:512.0MB 问题描述 求解方程ax2+bx+c=0的根.要求a, b, c由用户输入,并且可以为任意实数. 输入格式: ...

  5. 【JAVA习题十九】利用递归方法求5!。

    package erase; public class 用递归法求5的阶乘 { public static void main(String[] args) { // TODO Auto-genera ...

  6. Python—变量,条件语句,while循环,运算符,字符串等

     Python初识以及变量: 变量名:——字母 ——数字 ——下划线[见名识意] (PS:数字不能开头:不能是关键字:最好不能和python内置的东西重复) ##################### ...

  7. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(四)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  8. Centos7 安装 redis6 的部分问题总结

    首先把redis.tar.gz 解压到你想要的路径 检查一下安装环境: yum -y install gcc yum -y install epel-release 执行 make 和 make in ...

  9. kali系统安装后乱码的解决

    1.先添加kaili的源地址*(这里推荐了几个源,选一个就可以.打开/etc/apt/sources.list 删除里面自带的所有内容,把你复制的内容添加进去保存就ok了) #中科大 deb http ...

  10. nodejs 换源

    解决npm install安装慢的问题国外镜像会很慢 可用 get命令查看registry npm config get registry 原版结果为 http://registry.npmjs.or ...