acwing 839 模拟堆

news/2024/5/20 9:54:41 标签: 数据结构,

题面

在这里插入图片描述
在这里插入图片描述

题解(手写小根

在这里插入图片描述

down 操作 :向下更新,将父节点和两个子节点比较,值小的作为父节点,然后递归更新

在这里插入图片描述

up 操作 :向上更新 ,将此节点与其父节点比较,如果此节点的值小于父节点,就交换位置,然后继续向上更新

  1. “I x”,插入一个数x; 只需要在的最后插入一个数,然后up
  2. “PM”,输出当前集合中的最小值; 只需要返回序列中的第一个元素
  3. “DM”,删除当前集合中的最小值(数据保证此时的最小值唯一); 就是删除顶元素,我们可以让里的最后一个元素,将顶元素覆盖,再将新的顶元素down一遍
  4. “D k”,删除第k个插入的数; 将最后一个元素覆盖第k个插入的元素,然后down一遍
  5. “C k x”,修改第k个插入的数,将其变为x;先将第k个元素修改,修改完后值要么变大要么变小,我们可以down,up一遍(这两个只会执行一种)
  6. 补充: O(n) 的建方式 :for ( int i = n / 2 ; i >= 1 ; i-- ) down ( i ) ; 因为最后一层不需要down(有n/2个元素),直接从到数第二层开始 down

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 1e5 + 10;

int n, m;
int h[N], cnt;
int ph[N];  //ph[i]=j 表示第i个插入的点的在中下标是j
int hp[N]; //hp[i]=j 表示在中下标为i的点是第j个插入的点


void heap_swap(int a, int 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 << 1) <= cnt && h[t] > h[u << 1]) t = u << 1;
    if ((u << 1 | 1) <= cnt && h[t] > h[u << 1 | 1]) t = u << 1 | 1;
    if (u != t) {
        heap_swap(t, u);
        down(t);
    }
}


void up(int u) {
    while (u / 2 && h[u / 2] > h[u]) {
        heap_swap(u, u / 2);
        u >>= 1;
    }
}

int main() {

    m = 0;
    cin >> n;
    string op;
    int k, x;
    while (n--) {
        cin >> op;
        if (op == "I") {
            cin >> x;
            cnt++;
            m++;
            ph[m] = cnt;  //第m个插入的数在中的下标为size
            hp[cnt] = m;  //下标为size的数是第m个插入的数
            h[cnt] = x;
            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") {
            cin >> k;
            k = ph[k];//第k个插入的数在中的下标
            heap_swap(k, cnt);
            cnt--;
            down(k), up(k);
        } else {
            cin >> k >> x;
            k = ph[k];
            h[k] = x;
            down(k), up(k);
        }
    }
    return 0;
}

http://www.niftyadmin.cn/n/1572381.html

相关文章

算法竞赛进阶指南---0x17(二叉堆)合并果子

题面 题解 对于给定的数据&#xff0c;我们进行模拟&#xff0c;如果第一次合并 1 2 3 &#xff0c;第二次合并 3 9 12 &#xff0c;消耗的总体力值是 1 2 1 2 9 15我们换一种合并方式 &#xff1a;第一次合并 1 9 10 &#xff0c;第二次合并 10 2 12 &#xff0c;消…

linux 查看虚拟机内存,Linux基础教程:Linux下查看内存使用情况

/proc/meminfo 机器的内存使用信息/proc/pid/maps pid为进程号&#xff0c;显示当前进程所占用的虚拟地址。/proc/pid/statm 进程所占用的内存&#xff3b;rootlocalhost ~&#xff3d;# cat /proc/self/statm654 57 44 0 0 334 0输出解释CPU 以及CPU0。。。的每行的每个参数意…

算法竞赛进阶指南---0x17(二叉堆)超市

题面 输入样例 4 50 2 10 1 20 2 30 1 7 20 1 2 1 10 3 100 2 8 2 5 20 50 10 输出样例 80 185 题解 我们可以用一个小根堆来维护一个利润最大的集合&#xff0c;将所有产品按保质期从小到大排序&#xff0c;每次加入商品&#xff0c;判断集合中的商品是否满足在保质期能否卖出…

linux pptp添加用户,linux PPTP ××× 记录登陆用户名

pptpd的日志主要大部分都在/var/log/messages, /var/log/daemon等文件里面&#xff0c;但是仔细看了发现里面没有用户名&#xff0c;不知道用户是用了哪一个帐号登录上来的。于是就看了一下pppd的man&#xff0c;里面发现了一些环境变量如&#xff1a;IPLOCAL, IPREMOTE等&…

acwing 840 模拟散链表 (哈希)

题面 输入样例 5 I 1 I 2 I 3 Q 2 Q 5 输出样例 Yes No 题解1 拉链法 : 开一个大于N的数组,模N求出的 k 就是每个数哈希之后的位置,如果多个值在同一个位置,就拉出一条单链表,每个数组的开头就是单链表的头节点对于删除操作,我们可以不需要真正删除,直接新开一个bool数组标记一…

linux发行版本排行,linux 发行版排行_Linux发行版的排行

Linux发行版的排行JPG&#xff0c;600x449&#xff0c;132KB&#xff0c;333_2502016年最佳Linux发行版排行榜JPG&#xff0c;1024x768&#xff0c;132KB&#xff0c;333_2502016最佳Linux发行版排行榜JPG&#xff0c;600x336&#xff0c;128KB&#xff0c;447_2496年最受欢饮的…

acwing 841 字符串哈希

题面 输入样例 8 3 aabbaabb 1 3 5 7 1 3 6 8 1 2 1 2 输出样例 Yes No Yes 题解 我们将一个字符串看成是一个2进制的数&#xff0c;然后预处理出字符串的前缀哈希(这里的哈希值是以前缀为末尾字母为最低位&#xff0c;就比如前缀abc是以c为最低为就是1 * 22 2 * 21 3 * 20 )…

linux 磁盘io监控脚本,zabbix监控linux磁盘io的模板

最近&#xff0c;我发现zabbix没有监控linux的磁盘io&#xff0c;于是借助百度&#xff0c;我做了一个zabbix模板&#xff0c;用来监控磁盘io。1、添加自动寻找磁盘脚本&#xff1a;cat /home/monitor/disk_scan.sh#######################################!/bin/bash#written …