首页 > 其他分享 >[YM]模板-堆

[YM]模板-堆

时间:2024-08-20 21:54:56浏览次数:9  
标签:YM int len priority heap 节点 模板 op

概念:

堆是一种树形结构,堆顶始终是最优值(最大或最小)。

堆一般是用二叉树实现的,称为二叉堆。

二叉堆是一种完全二叉树

堆由对顶可以分为大根堆和小根堆 

————————————————————————————————

堆一般用数组去实现:

用数组A[ ]存储完全二叉树,节点数量是n,A[1]为根节点,有以下性质:

(1)i>1的节点,其父节点位于i/2

(2)如果2i>n,那么节点i没有孩子;如果2i+1>n,那么节点i没有右孩子

(3)如果节点i有孩子,那么他的左孩子是2i,右孩子是2i+1

堆有两种操作:进堆和出堆

priority_queue优先队列默认是大根堆

————————————————————————————————

模板:

struct Heap{
    int data[N]={0},len=0;
    void push(int e){
        data[++len]=e;
        int i=len;
        while(i>1&&data[i]<data[i/2]){
            swap(data[i],data[i/2]);
            i/=2;
        }
    }
    void pop(){
        data[1]=data[len--];
        int i=1;
        while(2*i<=len){
            int son=2*i;
            if(son<len&&data[son+1]<data[son])son++;
            if(data[son]<data[i]){
                swap(data[son],data[i]);
                i=son;
            }
            else break;
        }
    }
    int top(){
        return data[1];
    }
};

push详解:

void push(int x) {      //上浮,插入新元素
	heap[++len] = x;   //堆尾加入元素
	int i = len;       
	while (i > 1 && heap[i] < heap[i / 2]) {       //和它的父节点比较
		swap(heap[i], heap[i / 2]);
		i /= 2;    //更新父节点
	}
}

pop详解:

void pop() {     //下沉,删除推头,调整堆
	heap[1] = heap[len--];     //根节点替换为最后一个节点,节点数减一
	int i = 1;
	while (2 * i <= len) {      //至少有一个左儿子
		int son = 2 * i;         //左儿子
		if (son < len && heap[son + 1] < heap[son])  
			son++;       //son<len表示有右儿子,选儿子中较小的一个
		if (heap[son] < heap[i]) {      
			swap(heap[son], heap[i]);  //与较小的儿子交换
			i = son;      //下沉到儿子处
		}
		else break;       //如果不比儿子小,就停止下沉
	}
}

例题:

洛谷:P3378 【模板】堆 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码:

/*---code---*/
const int N = 1e6 + 5;
struct Heap{
    int data[N]={0},len=0;
    void push(int e){
        data[++len]=e;
        int i=len;
        while(i>1&&data[i]<data[i/2]){
            swap(data[i],data[i/2]);
            i/=2;
        }
    }
    void pop(){
        data[1]=data[len--];
        int i=1;
        while(2*i<=len){
            int son=2*i;
            if(son<len&&data[son+1]<data[son])son++;
            if(data[son]<data[i]){
                swap(data[son],data[i]);
                i=son;
            }
            else break;
        }
    }
    int top(){
        return data[1];
    }
};
Heap hp;
void solve(){
	int q;cin>>q;
    while(q--){
        int op,x;
        cin>>op;
        if(op==1){
            cin>>x;
            hp.push(x);
        }else if(op==2){
            cout<<hp.top()<<"\n";
        }else{
            hp.pop();
        }
    }
}

STL库的priority_queue:

priority_queue本身是大根堆,我们重载一下变成小根堆

小根堆:priority_queue<int,vector<int>,greater<int>>hp;

大根堆:priority_queue<int>hp;

/*---code---*/
const int N = 1e6 + 5;
priority_queue<int,vector<int>,greater<int>>hp;
void solve(){
	int q;cin>>q;
    while(q--){
        int op,x;
        cin>>op;
        if(op==1){
            cin>>x;
            hp.push(x);
        }else if(op==2){
            cout<<hp.top()<<"\n";
        }else{
            hp.pop();
        }
    }
}

标签:YM,int,len,priority,heap,节点,模板,op
From: https://blog.csdn.net/2302_80481841/article/details/141369222

相关文章

  • WPF:数据模板
    WPF:DataTemplate在XAML界面当中编写的任何代码,其实本质上都是转化成C#代码,既然如此来说,只要XAML有的对象,我们都可以用C#代码编写,但是为什么一般我们不这么做,是因为XAML更加容易去表达界面上的元素,代码的可视化以及可维护性。需求:当我想要在ListBox或者DataGridView......
  • leetcode322. 零钱兑换,完全背包最值问题,附背包问题模板
    leetcode322.零钱兑换给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。示例1:输入:coins=[1,2,5......
  • vue切换组件基础模板
    需求:登录注册两个按钮,点击登录的时候登录显示,点击注册的时候注册显示,另外一个隐藏如下图所示先定义两个template组件<templateid="login"><div><h2>用户登录</h2><p>用户名:<inputtype="text"v-model="us......
  • springboot怎么配置多个yml文件
    目录方式一:多个yml文件方式二:单个yml文件方式三:在pom.xml中指定环境配置掌握方式一就够了,方式二、三可以不看以下三种方式都可以实现多环境的配置。在application.yml主配置文件中做项目通用的配置,在其他配置文件中做不同环境下的配置,以避免重复配置的情况。方式......
  • 织梦模板引擎的代码样式有如下几种形式
    1、织梦模板引擎的代码样式有如下几种形式:{dede:标记名称属性='值'/} {dede:标记名称属性='值'}{/dede:标记名称}{dede:标记名称属性='值'}自定义样式模板(InnerText){/dede:标记名称}提示:如果使用带底层模板的标记,必须严格用{dede:标记名称属性='值'}{/ded......
  • 写作如何适应多变场景?AI工具集,多场景模板,轻松切换。
    迈入2024年,难道仍有人不谙熟AI写作之道吗?诸如日常繁琐的工作汇报、总结等任务,借助AI写作工具,便能迅速完成,有效解决了我们的棘手工作。当然,优质的AI写作工具能够创作出更高水准的文章,诸如学术论文、小说、营销策划案……在此,我并不打算对ChatGPT、文心一言等大型语言模型进行......
  • Android开发 - DisplayMetrics 类控制布局图形的缩放显示解析
    DisplayMetrics是什么DisplayMetrics类在Android中用于获取设备的显示属性(像素等)DisplayMetrics的主要属性metrics.density:屏幕密度,用于决定屏幕上每英寸的像素数DisplayMetricsmetrics=newDisplayMetrics();density=metrics.density;常见值:0.75(低密度)、1.0......
  • 如何从零编写一个vite插件 创建 vite 插件通用模板
    初始化mkdirvite-progress&&cdvite-progress&&pnpminit1.2安装typescriptpnpmitypescript@types/node-D1.3配置tsconfig.json{"compilerOptions":{"module":"ESNext","target":"esnext&quo......
  • 【OpenCV_python】凸包检测 轮廓特征 直方图均衡化 模板匹配 霍夫变换
    凸包特征检测凸包就是图像的最小外接多边形,通过图像的轮廓点,找到距离最远的两个点的直线,根据直线找到距离最远的下一个点,直到所有的点被包围在多边形内读取图像二值化找图像的轮廓获取凸包点的坐标绘制凸包点convexHull获得图像的凸包点cv2.convexHull(points,hu......
  • HTML5服装电商网上商城模板源码
    文章目录1.设计来源1.1主界面1.2购物车界面1.3电子产品界面1.4商品详情界面1.5联系我们界面1.6各种标签演示界面2.效果和源码2.1动态效果2.2源代码源码下载万套模板,程序开发,在线开发,在线沟通         【博主推荐】:前些天发现了一个巨牛的人工智能......