题目链接:http://hihocoder.com/problemset/problem/1105
题意:有两种操作,1.插入一个数据,2.取出最大的数据
解析:模板题,用大根堆解决:
//大根堆,每个节点的权值都比它的左右子节点的权值大的话,根节点值最大,但不能保证子节点的有序
#include <iostream>
#include <cstdio>
using namespace std;
#define M 100005
int heap[M],len;
void push(int x)
{//第一个元素的下标为1int i=++len;while(i>1){int p=i/2; //p为i的父节点if(heap[p]>=x)break;heap[i]=heap[p];i=p;}heap[i]=x;
}
int pop()
{int ret=heap[1]; //ret=最大值根节点int x=heap[len--];//x=最后一个节点int i=1;while(2*i+1<=len) //这是一个将大的节点值往上提的过程,这样的话如果i没有右节点但是有左节点,忽略了i的比较{int a=2*i,b=2*i+1;if(heap[b]>heap[a])//使a指向值较大的子节点a=b;if(x>=heap[a])break;heap[i]=heap[a];i=a;}heap[i]=x;return ret;
}
int main()
{int T,a;char op;len = 0;scanf("%d",&T);while(T--){getchar();scanf("%c",&op);if(op=='A'){scanf("%d",&a);push(a);}else{printf("%d\n",pop());}for(int i=1;i<=len;i++)cout<<heap[i]<<" ";cout<<endl;}return 0;
}