手写堆,代码难度高于思维难度,凑合着看
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int a[1000005],n,loa=0;
bool son(int s)
{
if(s*2<=loa)return true;
return false;
}
void inset(int k)
{
int p=loa+1;
loa++;
a[loa]=k;
while(a[p]<a[p/2]&&p>1)
{
swap(a[p],a[p/2]);
p=p/2;
}
}
int retu()
{
return a[1];
}
void delet()
{
loa--;
swap(a[1],a[loa+1]);
int p=loa;
int set=1;
while(set*2<=loa)
{
int x=set*2;
if(a[x]>a[x+1]&&x+1<=loa)x++;
if(a[set]<a[x])break;
swap(a[set],a[x]);
set=x;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int k;
cin>>k;
if(k==1)
{
int x;
cin>>x;
inset(x);
}
if(k==2)
{
cout<<retu()<<'\n';
}
if(k==3)
{
delet();
}
}
return 0;
}
无论什么时候一定要会手写堆!!!