堆(heap)
堆(heap)
push:插入一个元素,O(logn)
top:返回当前元素最小值,O(1)
pop:将当前最小元素弹出队列,O(logn)
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define rep(i,x,y) for (int i=x;i<=y;i++)
#define dep(i,y,x) for (int i=y;i>=x;i--)
using namespace std;
const int maxn=100000+10,INF=(1<<30);
int a[maxn],heap[maxn],n,x,k,size,type;
void init()
{
 rep(i,1,maxn-1) heap[i]=INF;
 size=0;
}
void push(int x)
{
 size++,k=size,heap[k]=x;
 while ((k>1)&&(heap[k]<heap[k>>1]))
 {
  swap(heap[k>>1],heap[k]);
  k>>=1;
 }
}
int top() {return heap[1];}
void pop()
{
 swap(heap[1],heap[size]);
 heap[size]=INF;
 size--,k=1;
 while ((k<<1)<=size)
 {
  if ((heap[k]<=heap[(k<<1)])&&(heap[k]<=heap[(k<<1)+1])) break;
  if (heap[(k<<1)]<heap[(k<<1)+1]) 
    swap(heap[(k<<1)],heap[k]),k<<=1; 
  else 
    swap(heap[(k<<1)+1],heap[k]),k=(k<<1)+1;
 }
}
int main()
{
 scanf("%d",&n);
 
 init();
 rep(i,1,n)
 {
  scanf("%d",&a[i]);
  push(a[i]);
 }
 while (scanf("%d",&type)==1)
 {
  if (type==1) 
  {
   scanf("%d",&x);
   push(x);
  }
  if (type==2) printf("- %d\n",top());
  if (type==3) pop();
 }
 return 0;
}
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号