题目链接

https://www.acwing.com/problem/content/841/

思路

纯纯模拟堆的操作,后面细说,可以先看代码

代码

#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000009
#define endl "\n"
#define PII pair<int,int>int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};ll ksm(ll a,ll b) {ll ans = 1;for(;b;b>>=1LL) {if(b & 1) ans = ans * a % mod;a = a * a % mod;}return ans;
}ll lowbit(ll x){return -x & x;}const int N = 2e6+10;
//----------------自定义部分----------------
int n,m,cnt,h[N],hp[N],ph[N];
//ph记录的是第i次存入的下标
//hp记录的是下标为i是第几次存入的
//ph和hp是一个互逆的数组void heap_swap(int a,int b){//a、b都是下标swap(ph[hp[a]],ph[hp[b]]);swap(hp[a],hp[b]);swap(h[a],h[b]);
}
void down(int u){//向下递归更新int t = u;if(u * 2 <= cnt && h[u * 2] < h[t]) t = u * 2;if((u * 2 + 1) <= cnt && h[u * 2 + 1] < h[t]) t = u * 2 + 1;if(u != t) {heap_swap(u,t);down(t);}
}void up(int u) {//向上更新while((u>>1) && h[u] < h[u>>1]) {heap_swap(u,u >> 1);u >>= 1;}
}int main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);string op;cin>>n;int k,x,kk=0;for(int i = 1;i <= n; ++i){cin>>op;if(op == "I"){//在堆中插入元素cin>>k;cnt++;kk++;//表示是第kk次插入的h[cnt] = k;ph[kk] = cnt,hp[cnt] = kk;up(cnt);}else if(op == "PM"){//第一个元素就是最小的cout<<h[1]<<endl;}else if(op == "DM"){heap_swap(1,cnt);cnt--;down(1);}else if(op == "D"){//删除第k次插入的数cin>>k;k = ph[k];//先找到第k个插入的下标heap_swap(k,cnt);//然后就是和删除头节点类似的操作,即交换最后一个元素,然后做一次downcnt--;down(k),up(k);}else{cin>>k>>x;//更改第k次插入的数k = ph[k];//还是先找到第k个插入的下标h[k] = x;//然后将改下标的值更改为xdown(k),up(k);//这个更改的值要么大于等于原来的h[k],要么小于等于,所以我们直接down和up就好了}} return 0;
}

AcWing 839. 模拟堆相关推荐

  1. 堆 AcWing 839. 模拟堆

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

  2. AcWing 839.模拟堆

    对于堆介绍可以看这篇博客 Acwing 838.堆排序_m0_50564748的博客-CSDN博客 这篇主要讲一下,如何找到第k个插入的数. 那么此时需要额外的两个数组来进行记录,分别是ph[k],h ...

  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. OpenCV java 图片处理,蒙太奇图片(13)
  2. Ecol. Lett.:写给实践生态学家的β多样性分析指南 | 朝花夕拾
  3. 在蓄电池管理系统中计算机应用,汽车电器与电子技术.docx
  4. 20、磁贴和磁贴通知(tile)(上)
  5. 《c语言从入门到精通》看书笔记——第6章 选择结构程序设计
  6. 服务器系统盘安装在sdb,从U盘自动安装centos5.3到服务器
  7. 5.FreeRTOS学习笔记- 互斥量
  8. 解决Golang程序运行时占用内存不断增加的问题
  9. python xlwt操作excel
  10. POI设置单元格格式
  11. 塔吊安全智能监控系统智慧工地整体解决方案
  12. 小米mix2安兔兔html5跑分,vivo X21跑分多少?高通骁龙660 AIE安兔兔跑分实测
  13. 想知道微信怎么做指纹支付开发?看这里!
  14. 获取公众号关注页面链接
  15. c语言编程怎么样,C语言怎么样,好学吗?
  16. 突然就看懂了《大话西游》
  17. html制作简单框架网页 实现自己的音乐驿站 操作步骤及源文件下载 (播放功能限mp3文件)
  18. 复旦情商课魅力女教师上课实录
  19. 12-18-2018学习2.410.6
  20. 基于Java的冒泡排序法

热门文章

  1. DisplayLink 安装错误
  2. Openstack+Kubernetes+Docker微服务实践之路--基础设施
  3. UI基础(四)之tableView (cell重用、原型cell、静态cell)/xib注意事项
  4. Linux内核分析——操作系统是如何工作的
  5. Android日志输出管理
  6. 小程序页面之间的跳转方法
  7. !heap 和 _HEAP_ENTRY
  8. Linux命令之sudo
  9. AVFoundation 零碎知识
  10. 201521123009 《Java程序设计》第11周学习总结