华师一附中OI组
标题:
P3378 【模板】堆
[打印本页]
作者:
admin
时间:
2018-5-4 09:49
标题:
P3378 【模板】堆
https://www.luogu.org/problemnew/show/P3378
题目描述
如题,初始小根堆为空,我们需要支持以下3种操作:
操作1: 1 x 表示将x插入到堆中
操作2: 2 输出该小根堆内的最小数
操作3: 3 删除该小根堆内的最小数
输入输出格式
输入格式:
第一行包含一个整数N,表示操作的个数
接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下:
操作1: 1 x
操作2: 2
操作3: 3
输出格式:
包含若干行正整数,每行依次对应一个操作2的结果。
输入输出样例
输入样例#1:
5
1 2
1 5
2
3
2
输出样例#1:
2
5
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=15
对于70%的数据:N<=10000
对于100%的数据:N<=1000000(注意是6个0。。。不过不要害怕,经过编者实测,堆是可以AC的)
作者:
admin
时间:
2020-3-23 21:47
典型的基本堆的使用,堆是一个完全二叉树,每一个根结点比它的左右儿子都小(或者大),我们利用这种数据结构来做此题:
用a(1)-a(n)表示这个堆,那么i的左儿子是2*i右儿子是2*i+1
每次新来一个结点,设为y=a(x),若x是偶数,则它是x/2的左儿子,若是奇数,则它是x/2的右儿子;
比较a(x)和a(x/2) ,若<,则要将y上移,然后递归,我喜欢用递归好理解。
void pushup(int x) /// 把a(x)向上调整到合适的位置
{
if (x==1) return ;
int y=x/2; ///x的儿子
if (a[y]>a[x])
{
swap(a[x],a[y]); ///交换一下
pushup(y);
}
}
复制代码
删除顶上的最小结点后,一般是把他和最后一个元素交换,然后比较,先算出左右儿子的那个最小值,然后和他比较,若比它小,就交换位置,然后递归。
void pushdown(int x) /// 把a(x)向下调整到合适的位置
{
if (2*x>tot) return ;/// 已经是叶子
int y,yl=x*2,yr=x*2+1;
if (yr>tot) y=yl;///没有右儿子那就只能看左儿子了
else if (a[yl]>a[yr]) y=yr;else y=yl;///选择左右儿子的较小
if (a[x]>a[y]) ///和最小的儿子交换
{
swap(a[x],a[y]);
pushdown(y);
}
}
复制代码
递归好理解,但是速度有损失,牛人可以自己理解后写成递推。
作者:
admin
时间:
2020-3-23 22:34
#include <bits/stdc++.h>
using namespace std;
const int mm=1000100;
int a[mm],tot,x,n;
void ArrayPr()
{
for(int i=1; i<=tot; i++) cout<<setw(3)<<a[i];
cout<<endl;
}
void pushup(int x) /// 把a(x)向上调整到合适的位置
{
if (x==1) return ;
int y=x/2; ///x的儿子
if (a[y]>a[x])
{
swap(a[x],a[y]); ///交换一下
pushup(y);
}
}
void pushdown(int x) /// 把a(x)向下调整到合适的位置
{
if (2*x>tot) return ;/// 已经是叶子
int y,yl=x*2,yr=x*2+1;
if (yr>tot) y=yl;///没有右儿子那就只能看左儿子了
else if (a[yl]>a[yr]) y=yr;else y=yl;///选择左右儿子的较小
if (a[x]>a[y]) ///和最小的儿子交换
{
swap(a[x],a[y]);
pushdown(y);
}
}
int main()
{
cin>>n;
tot=0;
int opt,x;
while (n--)
{
cin>>opt;
if (opt==1)
{
cin>>x;
a[++tot]=x;
pushup(tot);
}
if (opt==2) cout<<a[1]<<endl;
if (opt==3)
{
swap(a[1],a[tot]);
tot--;
pushdown(1);
}
///ArrayPr();
}
return 0;
}
/*
10
50 25 75 18 38 66 80 10 16 11
*/
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2