手写堆

OI
文章目录

最近打GMOJ老是被卡常,发现确实还需要备一个堆的模板,因为太懒了:

struct Priority_queue {
	pair<ll, ll> a[N];
	int siz;
	void yh(int &s){if(s<siz&&a[s+1]>a[s])s++;}
	void dnn(int &x,int &s){swap(a[s],a[x]),x=s,s=x*2;}
	void up(int x){while(x>1)if(a[x/2]<a[x])swap(a[x],a[x/2]),x/=2;else break;}
	void dn(int x){int s=x*2;while(s<=siz){yh(s);if(a[s]>a[x])dnn(x,s);else break;}}
	void push(pair<ll, ll> x){a[++siz]=x;up(siz);}
	void pop(){a[1]=a[siz--];dn(1);}
	bool empty(){return !(bool)siz;}
	pair<ll, ll> top(){return a[1];}
} que;

把上面的 pair<ll, ll> 替换为堆的类型即可。

本文作者:ZnPdCo

本文链接: https://znpdco.github.io/blog/2024/08/15/priority-queue/

本页面的全部内容在 CC BY-SA 4.0SATA 协议之条款下提供,附加条款亦可能应用

评论