对于堆介绍可以看这篇博客 Acwing 838.堆排序_m0_50564748的博客-CSDN博客

这篇主要讲一下,如何找到第k个插入的数。

那么此时需要额外的两个数组来进行记录,分别是ph[k],hp[k].

ph[k]:第k个插入的数在堆中的编号!

hp[k]:在堆中编号为k的元素是第几个插入的!

这其实是一个映射关系!

现在我们想要交换堆中编号1,2的元素!

839. 模拟堆 - AcWing题库

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=1e5+10;
int h[N],hp[N],ph[N],n,m,sizee;
//ph[k]插入的第k个数在堆里(树里)下标是几
//hp[k]堆里的编号为k的点是第几个插入的
void heap_swap(int a,int b)
{//第x次 插入的编号为 a ph[x]=a hp[a]=x h[a]//第y次 插入的编号为 b ph[y]=b hp[b]=y h[b]swap(ph[hp[a]],ph[hp[b]]);//交换之后,ph[x]=b,ph[y]=a;swap(hp[a],hp[b]);//交换之后,hp[a]=y,hp[b]=x;swap(h[a],h[b]);//交换元素值
}void up(int x)
{while(x/2 && h[x/2]>h[x]){heap_swap(x/2,x);x/=2;}
}void down(int x)
{int t=x;if(x*2<=sizee && h[x*2]<h[t]) t=x*2;if(x*2+1<=sizee && h[x*2+1]<h[t]) t=x*2+1;if(h[t]!=h[x]){heap_swap(t,x);down(t);}
}int main()
{scanf("%d",&n);while(n--){char op[10];scanf("%s",op);int k,x;if(!strcmp(op,"I")) {scanf("%d",&x);sizee ++ ;m ++ ;ph[m] = sizee, hp[sizee] = m;//ph[m]=sizee 第m次插入的数在堆中编号为sizee//hp[sizee]=m 编号为sizee的数是第m次插入h[sizee]=x;up(sizee);}else if(!strcmp(op,"PM")) printf("%d\n",h[1]);else if(!strcmp(op,"DM")){heap_swap(1,sizee),sizee--;down(1);}else if(!strcmp(op,"D")){scanf("%d",&k);k=ph[k];heap_swap(k,sizee);sizee--;down(k),up(k);}else{scanf("%d%d",&k,&x);k=ph[k];h[k]=x;down(k),up(k);}}return 0;
}

AcWing 839.模拟堆相关推荐

  1. 堆 AcWing 839. 模拟堆

    堆 AcWing 839. 模拟堆 原题链接 AcWing 839. 模拟堆 算法标签 堆 思路 由于题目需要支持随机修改删除, 因此需要存储每个节点映射 摘自该题解 交换过程 对应代码 void h ...

  2. AcWing 839. 模拟堆

    题目链接 https://www.acwing.com/problem/content/841/ 思路 纯纯模拟堆的操作,后面细说,可以先看代码 代码 #include<bits/stdc++. ...

  3. AcWing 839(模拟堆)

    题目链接:模拟堆 #include<iostream> #include<cstring> #include<algorithm> using namespace ...

  4. Day10 堆排序、模拟堆 trie树(字典树) 并查集

    堆呢就是一棵树完全二叉树... 小根堆的话,根节点就是最小值 维护堆只有两个操作 up(k) down(k) cnt是堆的大小 建堆的话只需要把前n/2的数down下来就ok 复杂度是小于O(n) 的 ...

  5. 堆(堆排序和模拟堆)

    如何手写一个堆 下标从1开始,如果从0开始的话,他的左儿子的下标就等于0*2 = 0,麻烦 手写堆可以实现的操作:1,插入一个数  2,求集合当中的最小值  3,删除最小值 4,删除任意一个元素  5 ...

  6. L2-012 关于堆的判断(模拟堆+字符串处理)

    视频讲解 https://www.bilibili.com/video/BV1W3411M72Z/ 题目链接 https://pintia.cn/problem-sets/99480504638070 ...

  7. AcWing 828. 模拟栈

    题目连接 https://www.acwing.com/problem/content/830/ 思路 我们直接开一个a数组,然后用一个整数top表示栈顶,0的时候表示为栈空,然后不断模拟就好啦 #i ...

  8. PAT甲级题目翻译+答案 AcWing(模拟)

    1008 Elevator (20 分) 思路 :last可能等于cur,而无论是否相等,res都是+5的 #include <iostream>using namespace std;i ...

  9. jzoj2292-PPMM【模拟,堆】

    正题 题目链接:https://jzoj.net/senior/#contest/show/3008/0 题目大意 一个队列要求支持 队尾压入一个数 队首弹出一个数 队列里所有数取反 求最大值 解题思 ...

最新文章

  1. Java Properties 类读取配置文件信息
  2. 小米语音首席科学家Daniel Povey:下一代Kaldi将走向何方?
  3. 前端:JS中JSON对象和String转换
  4. @transaction 提交事务_Kafka 事务实现原理
  5. zabbix 实践 (一)
  6. 纯CSS实现提示框小三角
  7. html5游戏 糖果派对,糖果派对, 第三层的游戏攻略, 怎玩才能合理的获得比较高的得分?...
  8. 博客园代码高亮显示教程
  9. 深入详解JVM内存模型与JVM参数详细配置
  10. FCN:Fully Convlutional Networks for semantic segmentation要点
  11. HDU4609 FFT
  12. 9-13 ruby环境准备
  13. Bailian2718 晶晶赴约会【水题】
  14. 巧用RoboCopy工具
  15. 目标管理 - SMART原则
  16. Apache ShenYu源码阅读系列-Dubbo插件
  17. 计算机单招知识点重点,2018年度单招考试《数学》必背知识点(一).doc
  18. 什么是数据驱动测试?学习创建框架
  19. 联创机房管理系统重连服务器失败,联创机房管理系统在CAD实验室应用探析.doc...
  20. SQL正则表达式进行搜索

热门文章

  1. OTA平台数智化赋能单体酒店,用“轻改造”创“高营收”!
  2. 设计模式之美-王争-极客时间-返现24元 限时优惠
  3. java web 实现多个文件压缩下载
  4. python3 模拟浏览器_关于python模拟浏览器行为
  5. 结营啦!有缘相聚于青训,未来高处见呀~~
  6. 蓝眼睛红眼睛_蓝眼睛技术
  7. 关于Keil5 jlink 与DFP包安装及排错经验笔记
  8. window wdk visual studio 2019 驱动编译
  9. HDU4521线段树
  10. C C++ 分别编程赋不同姓名的约瑟夫环及用WindowsApi(C++及C)显示离座过程动画