手磨二叉堆8pts求助
查看原帖
手磨二叉堆8pts求助
1053122
shy_lihui楼主2025/1/12 12:09
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10000005];
int siz=0;
int depth()//二分求树的高度 
{
	int l=0,r=20;
	int t=0;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(a[1<<mid]==0)
		{
			t=1<<mid;
			r=mid-1;
		}
		else
		{
			l=mid+1;
		}
	}
	return t+1;
}
int tree_min()
{
	return a[1];
}
void tree_delete()
{
	swap(a[1],a[siz]);
	siz--;
	int i=1;
	while(i<=siz/2)
	{
		int s=2*i;
		if(s+1<=siz && a[i+1]<a[i])
		{
			i++;
		}
		if(a[i]>a[s])
		{
			swap(a[i],a[s]);
			i=s;
		}
		else
		{
			break;
		}
	}
}
void tree_add(int x)
{
	int t=depth();
	t=1<<t;
	a[t]=x;
	while(t!=1)
	{
		int t2=(t%2==0?t/2:(t-1)/2);
		if(a[t]<a[t2])
		{
			swap(a[t],a[t2]);
			t=t2;
		}
		else
		{
			break;
		}
	}
}
bool flag=1;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n;
	while(n--)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			int x;
			cin>>x;
			if(flag==1)
			{
				a[1]=x;
				flag=0;
				continue;
			}
			tree_add(x);
		}
		else if(op==2)
		{
			cout<<tree_min()<<'\n';
		}
		else if(op==3)
		{
			tree_delete();
			if(siz==0)
			{
				flag=1;
			}
		}
	}
	return 0;
}
2025/1/12 12:09
加载中...