洛谷P3378——【模板】堆

洛谷P3378
洛谷P3378——【模板】堆_第1张图片

输入样例:
5
1 2
1 5
2
3
2
输出样例:
2
5

AC代码:

#include
using namespace std;
const int maxn=1e6+5;
int heap[maxn];
int ind=0;
void insertHeap()//自下向上调整堆,因为除新加的结点外符合小根堆定义
{
	for(int i=ind-1;i>0;i=(i-1)>>1)//不断找父结点
	{
		int fa=(i-1)>>1;//父结点
		if(fa>=0&&heap[fa]>heap[i])
			swap(heap[fa],heap[i]);
		else  //已经调整到合适位置
			break;
	}
	return ;
}
void deleteHeap()//自上向下调整堆,因为删除后,除新的根节点外符合小根堆定义
{
	swap(heap[0],heap[--ind]);//删除操作
	int p=0;
	for(int i=0;i<ind;i=p)
	{
		int lc=(i<<1)+1,rc=(i<<1)+2;
		if(lc>=ind)//不存在孩子结点
			break;
		p=lc;
		if(rc<ind&&heap[lc]>heap[rc])//指向小的子节点
			p++;
		if(heap[i]>heap[p])
			swap(heap[p],heap[i]);
		else  //已经调整到合适位置
			break;
	}
}
int main()
{
	int n,d;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&d);
		if(d==1)
		{
			scanf("%d",&heap[ind++]);//添加进堆
			insertHeap();//调整堆,使其成为小根堆
		}
		else if(d==2)
			printf("%d\n",heap[0]);//输出堆顶元素
		else
			deleteHeap();
	}
	return 0;
}

你可能感兴趣的:(题集)