首页 > 其他分享 >堆(模板)

堆(模板)

时间:2023-07-12 09:46:12浏览次数:26  
标签:int else break swap 操作 模板 size

题目描述

初始小根堆为空,我们需要支持以下3种操作:

操作1: 1 x 表示将x插入到堆中

操作2: 2 输出该小根堆内的最小数

操作3: 3 删除该小根堆内的最小数

Input

第一行包含一个整数N,表示操作的个数

接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下:

操作1: 1 x

操作2: 2

操作3: 3

Output

若干行正整数,每行依次对应一个操作2的结果。

样例输入

5
1 2
1 5
2
3
2

样例输出

2
5

范围提示

对于70%的数据,n<=10^4;
对于100%的数据,n<=10^6。

code:

#include <bits/stdc++.h>
using namespace std;
int a[10001],size;//建立堆与其元素个数 
void push(int x){//添加元素 
	if(size != 0){
		a[++size] = x;
		//调整顺序 
		int t = size;//t指向x的节点 
		while(t > 1 and a[t] < a[t/2]/*如果x比其父节点小*/){
			swap(a[t/2],a[t]);
			t/=2;
		}
	}else{//堆为空 
		a[1] = x;
		size++;
	}
}
void pop(){
	a[1] = a[size--];//把末尾元素移到堆顶 
	int t = 1;//t指向末尾元素 
	while(true){
		if(t*2>size){
			break;
		}else if(a[t*2+1] == 0){
			if(a[t] > a[t*2]){
				swap(a[t],a[t*2]);
				t*=2;
			}else 
				break;
		}else{//左右子节点都存在 
			int y;
			if(a[t*2+1] > a[t*2]) y = t*2;
			else y = t*2+1;
			if(a[y] < a[t]){
				swap(a[y],a[t]);
				t = y;	
			}else
				break;
		}
	}
}
int main(){
	memset(a,0,sizeof(a));
	int n,m;
	scanf("%d",&n);
	for(int i = 1;i<=n;i++){
		scanf("%d",&m);
		if(m == 1){
			int vx;
			scanf("%d",&vx);
			push(vx);
		}else if(m == 2){
			printf("%d\n",a[1]);
		}else{
			pop();
		}
	}
	return 0;
}

标签:int,else,break,swap,操作,模板,size
From: https://www.cnblogs.com/nasia/p/17546597.html

相关文章

  • 老杜 JavaWeb 讲解(九) ——模板方法设计模式、HttpServlet源码分析
    (十一)模板方法设计模式、HttpServlet源码分析对应视频:20-HttpServlet源码分析及web欢迎页11.1模板方法设计模式不用使用在上面右侧表格中,Person就是模板方法设计模式当中的模板类,通常是抽象类。day()方法就是模板方法设计模式当中的模板方法。模......
  • 「模板」树状数组
    引入题目描述给定\(n\)个数\(a[1],a[2],a[3]...a[n]\),现在又下面两种操作:1.询问区间\([x,y]\)的和,并输出。2.将下标为\(x\)的数增加\(val\)。一共\(x\)此操作\(1\len,m\le100000\),保证在\(int\)范围内。方法一:暴力枚举定义数组\(a\)储存\(n\)个元素。求区间和的时间复......
  • 自用模板
    #pragmaGCCoptimize(2)#include<bits/stdc++.h>#include<iostream>#include<vector>#include<algorithm>#include<set>#include<utility>#include<string.h>#include<ext/rope>#include<queue>#include&l......
  • 业务系统常规部署交接模板
    1总体情况ip应用192.168.1.1前端1192.168.1.2后端1......1.1前端1#1.进程查看#2.服务路径以及启停#3.版本更新#4.日志查看#5.配置文件说明1.2后端1#1.进程查看#2.服务路径以及启停#3.版本更新#4.日志查看......
  • 【模板】并查集
    简介并查集是什么并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。并查集其实就是一个树,如果要合并的话就将其中一个的根节点连接到另外一个的根......
  • 微信小程序(三)列表渲染&数据绑定&事件绑定&路由跳转&生命周期&本地存储&模板使用
    这里新建个页面log,然后用这个页面进行测试。同时修改app.json,将log页面设置为首页"pages":["pages/index/index","pages/log/log"],"entryPagePath":"pages/log/log",0.数据绑定0.简单的绑定wxml用{{val}}取变量<!--pages/log/lo......
  • 浮点数二分模板
    题目给定一个浮点数$n$,求它的三次方根。输入格式共一行,包含一个浮点数$n$。输出格式共一行,包含一个浮点数,表示问题的解。注意,结果保留$6$位小数。数据范围$−10000≤n≤10000$输入样例:$1000.00$输出样例:$10.000000$思路浮点数二分可以直接分,无需考虑边界情况......
  • 根据模板动态生成word(二)使用poi生成word
    @目录一、准备模板1、创建模板文件二、代码实践1、引入依赖2、自定义XWPFDocument2、公用的方法和变量3、工具类引用的包名4、段落文本替换5、图片替换6、表格替换7、完整的工具类代码三、验证模板生成1、测试代码2、生成效果四、总结一、准备模板1、创建模板文件创建一个word......
  • JAVA集成velocity实现对已有模板替换(占位符变量)替换
      平时我们如果有一些简单的模板替换需求,比如有个txt文件,或者代码生成模板文件要根据传入的变量替换成具体的值就可以使用这个框架 依赖<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId>......
  • 【模板】唯一分解定理
    问题描述任何大于\(1\)的正整数都能唯一分解为有限个质数的乘积:          \(N=p_1^{c_1}p_2^{c_2}...p_k^{c_k}\)其中\(p_1,p_2,\dots,p_k\)从小到大排列输入数据      一个数\(n(n\le10^{17})\)输出数据      将其质因数与其次数顺序输出   ......