//百练 实现堆结构
#include <iostream>
#include <cstdio>
#include <cstring>
long heap[100010];
long sz = 0;
void insert(long x)
{
//插入一个新元素,先将其放置最后端,逐步向上提升
long i = sz++;
while(i>0)
{
//p为父节点
long p = (i-1)/2;
//如果父节点值大于x,则将新插入结点上提
if(heap[p]>x)
{
heap[i]=heap[p];
i = p;
}
else break;
}
heap[i]=x;
}
long pop()
{
long ans = heap[0];
printf("%ld\n",ans);
//将末尾结点的值提上来
long x=heap[--sz];
//从根节点开始比对
long i = 0;
while(2*i+1<sz)
{
long left = 2*i+1;
long right = 2*i+2;
if(right<sz&&heap[right]<heap[left])
{
//注意left的变化
left = right;
}
if(heap[left]>=x) break;
heap[i] = heap[left];
i = left;
}
heap[i] = x;
}
using namespace std;
int main()
{
long t;
cin>>t;
while(t--)
{
sz = 0;
memset(heap,0,sizeof(heap));
long n;
cin>>n;
while(n--)
{
int type;
long num;
scanf("%d",&type);
if(type==1)
{
scanf("%ld",&num);
insert(num);
}
else
{
pop();
}
}
}
}
百练 实现堆结构
最新推荐文章于 2022-04-28 15:03:38 发布