AcWing 839. 模拟堆
题目链接
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. 模拟堆相关推荐
- 堆 AcWing 839. 模拟堆
堆 AcWing 839. 模拟堆 原题链接 AcWing 839. 模拟堆 算法标签 堆 思路 由于题目需要支持随机修改删除, 因此需要存储每个节点映射 摘自该题解 交换过程 对应代码 void h ...
- AcWing 839.模拟堆
对于堆介绍可以看这篇博客 Acwing 838.堆排序_m0_50564748的博客-CSDN博客 这篇主要讲一下,如何找到第k个插入的数. 那么此时需要额外的两个数组来进行记录,分别是ph[k],h ...
- AcWing 839(模拟堆)
题目链接:模拟堆 #include<iostream> #include<cstring> #include<algorithm> using namespace ...
- Day10 堆排序、模拟堆 trie树(字典树) 并查集
堆呢就是一棵树完全二叉树... 小根堆的话,根节点就是最小值 维护堆只有两个操作 up(k) down(k) cnt是堆的大小 建堆的话只需要把前n/2的数down下来就ok 复杂度是小于O(n) 的 ...
- 堆(堆排序和模拟堆)
如何手写一个堆 下标从1开始,如果从0开始的话,他的左儿子的下标就等于0*2 = 0,麻烦 手写堆可以实现的操作:1,插入一个数 2,求集合当中的最小值 3,删除最小值 4,删除任意一个元素 5 ...
- L2-012 关于堆的判断(模拟堆+字符串处理)
视频讲解 https://www.bilibili.com/video/BV1W3411M72Z/ 题目链接 https://pintia.cn/problem-sets/99480504638070 ...
- AcWing 828. 模拟栈
题目连接 https://www.acwing.com/problem/content/830/ 思路 我们直接开一个a数组,然后用一个整数top表示栈顶,0的时候表示为栈空,然后不断模拟就好啦 #i ...
- PAT甲级题目翻译+答案 AcWing(模拟)
1008 Elevator (20 分) 思路 :last可能等于cur,而无论是否相等,res都是+5的 #include <iostream>using namespace std;i ...
- jzoj2292-PPMM【模拟,堆】
正题 题目链接:https://jzoj.net/senior/#contest/show/3008/0 题目大意 一个队列要求支持 队尾压入一个数 队首弹出一个数 队列里所有数取反 求最大值 解题思 ...
最新文章
- OpenCV java 图片处理,蒙太奇图片(13)
- Ecol. Lett.:写给实践生态学家的β多样性分析指南 | 朝花夕拾
- 在蓄电池管理系统中计算机应用,汽车电器与电子技术.docx
- 20、磁贴和磁贴通知(tile)(上)
- 《c语言从入门到精通》看书笔记——第6章 选择结构程序设计
- 服务器系统盘安装在sdb,从U盘自动安装centos5.3到服务器
- 5.FreeRTOS学习笔记- 互斥量
- 解决Golang程序运行时占用内存不断增加的问题
- python xlwt操作excel
- POI设置单元格格式
- 塔吊安全智能监控系统智慧工地整体解决方案
- 小米mix2安兔兔html5跑分,vivo X21跑分多少?高通骁龙660 AIE安兔兔跑分实测
- 想知道微信怎么做指纹支付开发?看这里!
- 获取公众号关注页面链接
- c语言编程怎么样,C语言怎么样,好学吗?
- 突然就看懂了《大话西游》
- html制作简单框架网页 实现自己的音乐驿站 操作步骤及源文件下载 (播放功能限mp3文件)
- 复旦情商课魅力女教师上课实录
- 12-18-2018学习2.410.6
- 基于Java的冒泡排序法