首页 > 其他分享 >大根堆和小根堆

大根堆和小根堆

时间:2023-12-10 20:45:48浏览次数:23  
标签:大根堆 int up 根堆 down op

#include<iostream>
using namespace std;

int h[1000000];
int z=0;//z表示数列中有几个元素

void up(int x){
	while(x>1 && h[x]<h[x/2]){
		swap(h[x],h[x/2]);
		x /= 2;
	}
}

void down(int x){
	while(x*2<=z){
		int t=x*2;
		if(t+1<=z && h[t+1]<h[t]) t++;
		if(h[t]>=h[x]) break;
		swap(h[x],h[t]);//交换
		x=t;
	}
}

int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		int op;
		cin>>op;
		if(op==1){
			int x;
			cin>>x;
			h[++z]=x;
			up(z);
		}
		if(op==2){
			cout<<h[1]<<endl;
		}
		if(op==3){
			h[1]=h[z--];
			down(1);
		}
	}
	return 0;
}

  洛谷P3378堆的模板

规律是x/2

 

插入为向上排序

删除为向下排序

小根堆——

up: h[x]<h[x/2]

down: h[t]>=h[x]

而大根堆——

up: h[x]>h[x/2]

down: h[t]<=h[x]

标签:大根堆,int,up,根堆,down,op
From: https://www.cnblogs.com/wxzh-t/p/17893190.html

相关文章

  • 大根堆/小根堆
    #include<iostream>#include<algorithm>#include<vector>#include<queue>#include<random>#include"util.h"usingnamespacestd;structPoint{intx,y;//priority_queue<Point>大根堆需要重载小于号boolo......
  • python 大根堆
    python默认的都是小根堆,实现数字的大根堆,可在堆化前把数字乘以-1,输出时再乘以-1变回原值。比如:[5,20,6],堆化前用列表推导式把列表转为: [-5,-20,-6]importheapqimportrandomdata=list(range(1,30))random.shuffle(data)#打乱顺序data=data[:12]#......
  • 大根堆和小根堆在海量数据的top N问题中,时间复杂度O(nlogN)
    堆可视化操作演示:https://visualgo.net/zh/heap堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:小根堆:Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者大根堆Key[i]>=Key[2i+1]&&key>=key[2i+2]即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆分为大根堆......
  • HZOI 大根堆 线段树合并
    题目描述给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点。每个点有一个权值v_i。你需要将这棵树转化成一个大根堆。确切地说,你需要选择尽可能多的节点,满足大根堆的性质:对于任意两个点i,j,如果i在树上是j的祖先,那么v_i>v_j。请计算可选的最多的点数,注意这些点不必形成......
  • 算法-丑数2-构造小根堆
    intNthUglyNumber(intn){if(n==1)return1;List<long>arr=newList<long>();//这里用list,它会自己扩容,用数组就需要自己操作这些了arr.Add(1);int[]uglyArr={2,3,5};HashSet<long>hs=newHashSet<long>();hs.Add(1);......
  • 小根堆
    packageclass06;importjava.util.Comparator;importjava.util.PriorityQueue;/***只把标记1,和标记2,两处的大于号,改成小于号,就是小根堆。*/publicclassCod......
  • 实现一个大根堆。 包括添加方法push(int value),弹出方法pop()。
    packageclass06;importjava.util.Comparator;importjava.util.PriorityQueue;/***实现一个大根堆。*包括添加方法push(intvalue),弹出方法pop()。*弹出......
  • 大根堆+贪心算法
    前篇文章使用贪心算法求可达到最远建筑,还存在一些问题,只能取局部最优解。大根堆+贪心算法神偷Jacky身上带着一堆砖头和可以无限伸缩的梯子在楼顶穿梭。如果遇到下一......
  • 大根堆和小根堆来存储结构体
    在用priority_queue存储结构体时(假设结构体的类型为Node),我们不能用priority_queue<Node,vector<Node>,greater<Node>>h然后重载<来表示小根堆,会编译失败我们应该统......
  • [BZOJ4919]大根堆 解题报告
    [BZOJ4919]大根堆Description给定一棵\(n\)个节点的有根树,编号依次为\(1\)到\(n\),其中\(1\)号点为根节点。每个点有一个权值\(v_i\)。你需要将这棵树转化成一个大根堆。......