二叉堆

//P3378
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int heap[N],len=0;
void push(int x){
    heap[++len]=x;
    int i=len;
    while(i>1&&heap[i]<heap[i/2]){
        swap(heap[i],heap[i/2]);
        i=i/2;
    }
}
void pop(){
    heap[1]=heap[len--];
    int i=1;
    while(2*i<=len){
        int son=2*i;
        if(son<len&&heap[son+1]<heap[son]){
            son++;
        }
        if(heap[son]<heap[i]){
            swap(heap[son],heap[i]);
            i=son;
        }
        else break;
    }
}
int main(){
    int n;
    cin>>n;
    while(n--){
        int op;
        cin>>op;
        if(op==1){
            int x;
            cin>>x;
            push(x);
        }
        else if(op==2){
            cout<<heap[1]<<endl;
        }
        else pop();
    }
    return 0;
}

全部评论

相关推荐

01-18 09:26
已编辑
门头沟学院 Java
王桑的大offer:建议中间件那块写熟悉即可,写掌握 面试包被拷打到昏厥
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务