手写堆44pt,求调,有注释!
查看原帖
手写堆44pt,求调,有注释!
1330072
Relisc楼主2024/7/5 19:48
#include <bits/stdc++.h>
using namespace std;
const  int N=1e7;
long long h[N];
int n,op;
int idx;

//堆从pos位置向上调整,使其满足小根的性质
void siftup(int pos)
{
	while( pos>1 && h[pos]< h[pos/2])	
	{
		swap(h[pos],h[pos/2]);
		pos /=2;
	}
}

//堆从pos位置向下调整,使其满足小根的性质;
void siftdown(int pos)
{	
	int j=pos*2;
	if( j <= idx)//先判断左孩子不越界
	{
		if( j+1<=idx && h[j]>h[j+1])	j++;
		//右孩子小于左孩子,右孩子才是更小的
	}
	
	while(pos <= idx && h[pos]>h[j] )
	{
		swap(h[pos],h[j]);
		pos=j;
		j *=2;
	}
}

//向堆中插入x
void insert(long long x){
	h[++idx]=x;     //x加在堆数组末尾
	siftup(idx);    //从插入位置向上调整;
}

//输出堆顶元素
void top(){
	cout<<h[1]<<endl;
}

//删除堆顶元素
void remove(){
    if(idx >= 1)
    {
    	h[1]=h[idx--];//堆最后元素覆盖堆顶,堆规模减1
    	siftdown(1);//从堆顶向下调整
    }
}

 
int main(){
	cin>>n;
	while(n--)
	{
		cin>>op;
		if(op == 1)		{long long x;cin>>x;insert(x);}
		if(op == 2)		top();
		if(op == 3)		remove();
	}
	//
	return 0;
}

2024/7/5 19:48
加载中...