当前位置: 首页 > article >正文

2.数据结构:7.模拟堆

ph 数组的下标表示的是第 k 个插入的数,对应的值表示的是对应到 heap 里面的下标。比如说,刚开始的时候是 m ,对应的是 mysize 。那么就有 ph[m]=mysize, hp[mysize]=m

#include<algorithm>
#include<cstring>
#include<iostream>

using namespace std;

const int N=100010;
int n;
int mysize;
int m;
int h[N];
int ph[N];
int hp[N];

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(2*u<=mysize&&h[2*u]<h[t]){
        t=2*u;
    }
    if(2*u+1<=mysize&&h[2*u+1]<h[t]){
        t=2*u+1;
    }
    if(t!=u){
        heap_swap(t,u);
        down(t);
    }
}

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

int main(){
    cin>>n;
    while(n--){
        char op[10];
        cin>>op;
        if(!strcmp(op,"I")){
            int x;
            cin>>x;
            m++;
            mysize++;
            h[mysize]=x;
            ph[m]=mysize;
            hp[mysize]=m;
            up(mysize);
        }else if(!strcmp(op,"PM")){
            printf("%d\n",h[1]);
        }else if(!strcmp(op,"DM")){
            heap_swap(1,mysize);
            mysize--;
            down(1);
        }else if(!strcmp(op,"D")){
            int k;
            cin>>k;
            k=ph[k];
            heap_swap(k,mysize);
            mysize--;
            down(k);
            up(k);
        }else{
            int k,x;
            cin>>k>>x;
            k=ph[k];
            h[k]=x;
            up(k);
            down(k);
        }
    }
    
    return 0;
}

http://www.kler.cn/a/573747.html

相关文章:

  • AI绘画软件Stable Diffusion详解教程(5):主模型的选择
  • 数据守护者:备份文件的重要性与自动化实践策略
  • 面试题汇总(一)
  • 将自定义vue组件加载在Mapbox或Maplibre的marker和popup上
  • SpringBoot3—场景整合:NoSQL
  • 开源模型应用落地-LangGraph101-探索 LangGraph人机交互-添加断点(一)
  • 准确---Liunx查看出口ip的命令
  • Leetcode 57: 插入区间
  • 快速熟悉JavaScript
  • Linux的一些配置(网络建设与运维)
  • 【软考-架构】9.2、摘要-签名-PKI-访问控制-DOS-欺骗技术
  • 计算机网络(1) 网络通信基础,协议介绍,通信框架
  • 基于微信小程序的小区服务管理系统+论文源码调试讲解
  • 基于SSM+MySQL的二手书籍交易系统
  • wheel_legged_genesis 开源项目复现与问题记录
  • llama.cpp: GGUF格式及模型量化参数介绍
  • 突破传统:用Polars解锁ICU医疗数据分析新范式
  • C语言【指针篇】(四)
  • vueDraggable插件拖拽过程中节点文本不允许选中方案
  • 最新技术趋势与应用解析:未来科技走向