二叉堆

手写

constexpr int maxn=3e5+10;
int h[maxn],n;
void up(int p)
{
	while (p>1)
	{
		if (h[p]>h[p>>1])
		{
			swap(h[p],h[p>>1]);
			p>>=1;
		}
		else break;
	}
}
void down(int p)
{
	int s=p<<1;
	while (s<=n)
	{
		if (s<n && h[s]<h[s+1]) s++;
		if (h[s]>h[p])
		{
			swap(h[s],h[p]);
			p=s;
			s=p<<1;
		}
		else break;
	}
}
void insert(int val)
{
	h[++n]=val;
	up(n);
}
void pop()
{
	h[1]=h[n--];
	down(1); 
}
int gettop() {return h[1];}
void del(int p)
{ 
	h[p]=h[n--];
	up(p);
	down(p);
}
//priority_queue<int> q;
  • insert:在堆顶加入一个数
  • pop:弹出堆顶
  • gettop:得到堆顶元素
  • del:删除一个在数组中下标为p的元素
  • 使用priority_queue<int,vector<int>,greater<int> > q;改为小根堆
posted @ 2026-05-19 11:40  msjing  阅读(8)  评论(0)    收藏  举报