模板链接: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

题解

某位毒瘤张瀚文老师的福,学习了一大堆堆知识。

配对堆不像其他娇气的堆,它对堆本身的形态没有什么要求,只要是棵树就行了,插入/合并也很任性,直接比较两个根的大小,优先级高的当爸爸,轻松O(1)O(1)O(1)完成插入/合并。

配对堆还可以支持改变堆中元素的值,只需要将元素原来的父边断掉,修改完权值后直接与根合并就完了,虽然看起来是O(1)O(1)O(1)的,但是因为会影响到poppoppop操作,所以均摊下来复杂度为O(log2n)O(log2n)O(log_2n)。

因为前面的操作比较随意,所以poppoppop操作要收拾随意连边的烂摊子,我们要把根节点的所有儿子不停地两两合并合成一棵树,复杂度是O(儿子个数)O(儿子个数)O(儿子个数)的,但是神奇摊还分析说,它是O(log2n)O(log2n)O(log_2n)的,它就是O(log2n)O(log2n)O(log_2n)的。

代码

贼好写,甚至短于左偏树。

#include<bits/stdc++.h>
using namespace std;
const int M=2e6+5;
int n,root,id,tot,top,val[M],head[M],nxt[M],to[M],dad[M];
queue<int>dui;
void add(int x,int y){nxt[++id]=head[x],head[x]=id,to[id]=y,dad[y]=x;}
int _new(int x){val[++tot]=x;return tot;}
int merge(int x,int y){if(!x||!y)return x+y;if(val[x]<val[y]){add(x,y);return x;}else {add(y,x);return y;}}
void pop()
{int t;for(int i=head[root];i;i=nxt[i])if(dad[to[i]]==root)dui.push(to[i]),dad[to[i]]=0;while(dui.size()>1){t=dui.front();dui.pop();dui.push(merge(dui.front(),t));dui.pop();}if(dui.size())root=dui.front(),dui.pop();else root=0;
}
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),root=merge(_new(x),root);else if(op==2)printf("%d\n",val[root]);else pop();}
}
int main(){in();ac();}

[数据结构] 配对堆相关推荐

  1. 配对堆Pairing Heap

    前言 最近做一道Dijkstra的题目,因为边数实在太大了(10910910^9),用STL的priority_queue直接超时(事实上还会MLE).有同学写配对堆的.刚好很久没学习新的数据结构了, ...

  2. 配对堆(Pairing Heap)

    配对堆(Pairing Heap)是一个简单实用的min-heap结构(当然也可以做成max-heap).它是一颗多路树(multiway tree),类似于Leftist Heap和Skew Hea ...

  3. 算法(4)数据结构:堆

    1.0 问题描述 实现数据结构:堆. 2.0 问题分析 堆一般使用数组来表示,其中某个节点下标i的两个子节点的下标为 2i+1 和 2i+2.堆是一棵完全二叉树. 堆有3种基本操作:创建,插入,删除. ...

  4. 数据结构,堆和栈和队列的概念

    数据结构,堆和栈和队列的概念 1 什么是数据结构 数据结构是计算机存储,组织数据的反复改.数据结构是指相互之间存在的一种或多种特定关系的数据元素集合. 2 数据结构的逻辑结构 1 集合结构,元素都是孤 ...

  5. 数据结构之堆的插入、取值、排序(细致讲解+图片演示)

    数据结构之堆(Heap):插入.取值.排序. 堆是一种数据结构,分为最小堆和最大堆,可以用二叉树来表示. 在二叉树的任意的一个三角结构中(一个父节点,两个子节点),需要满足以下两个条件: 1.父节点要 ...

  6. (十)数据结构之“堆”

    数据结构之"堆" 堆是什么? JS中的堆 堆的应用 第K个最大元素 LeetCode:215.数组中的第K个最大元素 LeetCode:347.前K个高频元素 LeetCode:2 ...

  7. 【数据结构】堆、堆排序笔记

    [数据结构]堆.堆排序笔记 堆是一棵完全二叉树,树的每个结点的值都不小于(或者不大于)其左右孩子的值. 父亲结点大于等于孩子结点的值叫做大顶堆,反之叫做小顶堆 大顶堆的每个结点的值都是以它为根结点的子 ...

  8. Jemalloc 深入分析 之 配对堆Pairing Heap

    为了更好的阅读效果,推荐下载pdf文档: 详细文章请参考:<jemalloc 深入分析> https://github.com/everschen/tools/blob/master/DO ...

  9. 【数据结构】堆的实现

    [数据结构]堆--完全二叉树顺序存储实现 "我想要现实的真相和爱的幻想,做成精神的房梁,敷脊背的伤." --<我想要> ✨✨

  10. 【数据结构与算法】配对堆的Java实现

    PairingHeap的编程实现 /*** Implements a pairing heap.* Supports a decreaseKey operation.* Note that all & ...

最新文章

  1. Android Camera 通过V4L2与kernel driver的完整交互过程
  2. 很好的理解梯度 散度 旋度 下三角运算 费曼物理讲义
  3. jsonwebtoken中文文档
  4. 数据标准化 - scale() - Python代码
  5. java akka_AKKA文档(java版)——什么是AKKA?
  6. 需求说明 用户登陆功能的实现 c#
  7. vsCode切换分支git
  8. StackExchange.Redis学习笔记(三) 数据库及密码配置 GetServer函数
  9. 分布式相关面试题总结
  10. IPv6在3G网的应用(转)
  11. SolidWorks学习(1):基础绘图
  12. LeetCode - 441 - 排列硬币(arranging-coins)
  13. 如何将多个excel表格合并成一个_怎么将多个pdf文件合并成一个?
  14. 短信接口被恶意调用,瞬间损失两万,怎么解决?
  15. Android课程设计-体育新闻app
  16. 这款Shadertoy转换器,太牛逼了!
  17. Unity3D游戏开发之当游戏开发遇上Excel
  18. 阿里云RPA操作——当前窗口截图
  19. 单人被罩标准的尺寸是多少
  20. sql函数--04---ROW_NUMBER() OVER()函数用法详解

热门文章

  1. 计算机维护记录软件,《企业计算机软件故障维护记录》(4页)-原创力文档
  2. Raki的读paper小记:Kernel Continual Learning
  3. 147.有序数组的TwoSum(力扣leetcode) 博主可答疑该问题
  4. html如何判断ie版本,在html中判断IE浏览器的版本
  5. java中json进阶_JSON学习
  6. 数据分析好学吗_数据分析篇 | 一个虎扑社区数据分析实战
  7. 对于传统scnece-classfication的分析
  8. Centos7 minimal 安装npm
  9. [MySQL]触发器
  10. 【JZOJ4832】【NOIP2016提高A组集训第3场10.31】高维宇宙