模板链接:https://www.luogu.org/problemnew/show/P3371

【模板】堆

题目描述

如题,初始小根堆为空,我们需要支持以下3种操作:

操作1: 1 x 表示将x插入到堆中

操作2: 2 输出该小根堆内的最小数

操作3: 3 删除该小根堆内的最小数

输入输出格式
输入格式:

第一行包含一个整数N,表示操作的个数

接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下:

操作1: 1 x

操作2: 2

操作3: 3

输出格式:

包含若干行正整数,每行依次对应一个操作2的结果。

输入输出样例
输入样例#1:

5
1 2
1 5
2
3
2

输出样例#1:

2
5

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=15

对于70%的数据:N<=10000

对于100%的数据:N<=1000000(注意是6个0。。。不过不要害怕,经过编者实测,堆是可以AC的)

样例说明:

故输出为2、5

题解

张瀚文老师真是太毒瘤有才啦!!!orz

三十二叉堆,顾名思义,就是有三十二叉的堆,我们可以将每个数看做一个长为323232的010101串,把555位01" role="presentation" style="position: relative;">010101放在一起看做一个字母,构成一个类似TrieTrieTrie树的结构,就可以把一个intintint范围的数插入到三十二叉堆中。

问题在于,我们怎么快速找到最小值呢???总不能遍历这三十二叉吧。

看到这个三十二,有没有想起什么?没错,一个intintint就是三十二位的,我们可以把一个节点三十二叉的存在情况压到一个intintint里!!!通过调用__builtin_ctz函数,我们就能快速知道最小的且存在的那一叉在哪儿,便可以直接跳到下一层节点了。

这样我们每次操作就是O(log2MAXlog232)O(log2MAXlog232)O(\frac{log_2MAX}{log_232})的了,常数也很小,而且可以同时维护最大最小值,甚至可以变成一个setsetset!!!

代码
#include<bits/stdc++.h>
#define uint unsigned int
using namespace std;
const int N=1e6,M=N<<2;
uint bit[M],inf=INT_MAX;
int son[M][32],cot[M],di[10],val[M],tot,n;
int lg(uint x){return __builtin_ctz(x);}
void ins(int x)
{int v=0,t=x;for(int i=7;i>=1;--i,x>>=5)di[i]=x%32;for(int i=1;i<=7;++i){++cot[v];if(!son[v][di[i]])son[v][di[i]]=++tot;bit[v]|=(1u<<di[i]);v=son[v][di[i]];}++cot[v];val[v]=t;
}
int top()
{if(!cot[0])return 0;int v=0;for(int i=1;i<=7;++i)v=son[v][lg(bit[v])];return val[v];
}
void pop()
{if(!cot[0])return;int v=0,f;uint tmp;for(int i=1;i<=7;++i){tmp=lg(bit[v]);f=v;v=son[v][tmp];if(cot[v]==1)bit[f]&=inf<<tmp+1;--cot[f];}cot[v]--;
}
void in(){scanf("%d",&n);}
void ac()
{int op,x;for(int i=1;i<=n;++i){scanf("%d",&op);if(op==1)scanf("%d",&x),ins(x);else if(op==2)printf("%d\n",top());else pop();}
}
int main(){in();ac();}

[数据结构] 三十二叉堆相关推荐

  1. 数据结构之优先队列--二叉堆(Java实现)

    前言 数据结构队列的学习中,我们知道队列是先进先出的.任务被提交到队列中,按照先进先出的原则 对各个任务进行处理.不过在现实的情况下,任务通常有着优先级的概念,例如短任务.管理员的操作 应该优先执行. ...

  2. java实现二叉堆,数据结构基础篇-二叉堆

    二叉堆分为两种,最大堆和最小堆,我们只讨论最小堆的性质,最大堆具有相同的原理. 最小堆是一种符合下面两个特性的树形结构: 最小堆是一颗完全二叉树,即最小堆的每个节点要么没有子节点,要么只有一个左子节点 ...

  3. 数据结构与算法--二叉堆(最大堆,最小堆)实现及原理

    二叉堆(最大堆,最小堆)实现及原理 二叉堆与二叉查找树一样,堆也有两个性质,即结构性质和堆性质.和AVL树一样,对堆的一次操作必须到堆的所有性质都被满足才能终止,也就是我们每次对堆的操作都必须对堆中的 ...

  4. java 二叉堆_二叉堆的介绍和Java实现

    一.堆和二叉堆 堆,英文名称Heap,所谓二叉堆(也有直接称二叉堆为堆的),本质上是一个完全二叉树,前面也提到过,如果树接近于完全二叉树或者满二叉树,采用顺序存储代价会小一点,因此常见的二叉堆均是顺序 ...

  5. 【tree】二叉堆(大顶堆或小顶堆)

    本文目录 一.二叉堆的定义 结构性质 堆序性质 二.二叉堆的底层存储结构 三.二叉堆的插入 四.二叉堆的删除 五.源码和测试 系列目录 <树> <树的遍历> <二叉查找树 ...

  6. 0x17.基础数据结构 - 二叉堆

    目录 一.二叉堆 二.例题 0.AcWing 145. 超市 AcWing 146. 序列(POJ 2442) 三.HuffmanHuffmanHuffman树 1.AcWing 148. 合并果子 ...

  7. 静态树表查找算法及C语言实现,数据结构算法C语言实现(三十二)--- 9.1静态查找表...

    一.简述 静态查找表又分为顺序表.有序表.静态树表和索引表.以下只是算法的简单实现及测试,不涉及性能分析. 二.头文件 /** author:zhaoyu date:2016-7-12 */ #inc ...

  8. 【数据结构与算法拓展】二叉堆原理、实现与例题(C和java)

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  9. ReviewForJob——二叉堆优先队列的实现(三种堆节点类型——int + struct HeapNode + struct HeapNode*)

    [0]README 1)本文旨在给出 二叉堆优先队列的实现 的代码实现和分析, 而堆节点类型 不外乎三种: 一, 基本类型如int: 二,结构体类型 struct HeapNode: 三,结构体指针类 ...

  10. 【数据结构与算法】二项队列与二叉堆的比较

    导语 二叉堆确实是入门级的重要数据结构了,而二项队列也是慢慢要去掌握的一种支持高效合并的优先队列实现.本文稍作比较,望抛砖引玉. 列个表格比较基本操作性能 基本操作 insert(平均) delete ...

最新文章

  1. 刷新存储器的容量单位是什么_GD25Q80CSIG|相变存储器是什么,具备什么特点?
  2. 作者:陶克(1988-),男,博士,北京系统工程研究所助理研究员。
  3. ue4蓝图和ai的区别_UE4 AI基础
  4. QTP的那些事--共享对象库的使用
  5. StudyTonight 中文系列教程【翻译完成】
  6. 手写数字阅读器用户界面
  7. 终结者:使用slf4j+log4j完美构建日志
  8. Atitit 面向对象  封装的实现原理
  9. 锐起无盘服务器设置教程,“锐起无盘XP”教程安装调试教程
  10. 搏一搏,单车变摩托!华为天才少年耗时四月将自行车强势升级为自动驾驶
  11. Appium 自动化测试 H5页面元素定位
  12. 海思Hi3136芯片怎么样?Hi3136处理器参数介绍
  13. efi启动修复linux引导文件夹,一次修复linux的efi引导的集中方法总结记录
  14. 数据库基础知识(八)
  15. 活期利率是怎么计算的?
  16. MySQL中的describe关键字
  17. “核高基”的专家有哪些人?
  18. html中哪个是正确引用外部样式表的方法,以下的HTML中( )是正确引用外部样式表的方法 答案:link rel=stylesheet type=text/css href=mystyl...
  19. 神秘国度的爱情故事--数据结构课程设计
  20. SQL学习笔记——task06:SQL综合练习

热门文章

  1. w8fuckcdn 通过扫描全网绕过CDN获取网站IP地址
  2. 一句话木马针对的不同框架使用
  3. Raki的读paper小记:TriggerNER: Learning with Entity Triggers as Explanations for Named Entity Recognition
  4. 统计每个url访问的topN用户以及访问次数(sql)
  5. 编写java程序手动挡car_阅读下列说明、图和Java代码,填补空缺。[说明] 已知对某载客车辆(Car)进行类建模,如图13-2所示,其 - 赏学吧...
  6. linux edi esi eax 汇编指令,汇编指令lodsb和stosb、lodsd和stosd
  7. How to support Specular-Glossiness in Three.js
  8. android 模仿今日头条ViewPager+TabLayout
  9. jquery 获取网页参数
  10. 【GIS开发者】(GISDeveloper) 11-14期 提供下载