求助堆(44pts)未过
查看原帖
求助堆(44pts)未过
701478
_FastFT2013楼主2024/1/13 15:35

用的手写堆

#include<iostream>
#define fa(x) (x>>1)
#define le(x) (x<<1)
#define ri(x) ((x<<1)|1) 
using namespace std;
const int dui_ms=1e6+5;//堆的最大空间
template<typename T>
struct small_dui{//小根堆 
	T a[dui_ms<<1];
	int back=0;
	void push(T x){//添加元素 
		if(back==0){
			a[++back]=x;
		}else{
			int k=++back;
			a[back]=x;
			while(fa(k)>0){
				if(a[k]<a[fa(k)]){
					swap(a[k],a[fa(k)]);
					k=fa(k);
				}else{
					break;
				}
			}
		}
	}
	void pop(){//删除堆内最小元素(堆顶元素) 
		if(back==1){
			back=0;
		}else{
			a[1]=a[back];
			back--;
			int k=1;
			while(ri(k)<=back){
				if(a[le(k)]<a[ri(k)]){
					swap(a[le(k)],a[k]);
					k=le(k);
				}else{
					swap(a[ri(k)],a[k]);
					k=ri(k);
				}
			}
		}
	}
	T front(){//堆内最小元素(堆顶元素)
		return a[1];
	}
};
small_dui<int>d; 
void solve(){
	int op;
	cin>>op;
	if(op==1){
		int x;
		cin>>x;
		d.push(x); 
	}else if(op==2){
		cout<<d.front()<<"\n";
	}else{
		d.pop();
	}
}
int main(){
	int t;
	cin>>t;
	while(t--)solve();
	return 0;
}
2024/1/13 15:35
加载中...