P3378 【模板】堆

手写堆。

const int N=1e6+10;
int heap[N];
int n,m;

void up(int u)
{
    while(u/2 && heap[u] < heap[u/2])
    {
        swap(heap[u],heap[u/2]);
        u/=2;
    }
}

void down(int u)
{
    int j=u*2;
    while(j <= n)
    {
        if(j<n && heap[j] > heap[j+1])
            j++;
        if(heap[j] < heap[u])
        {
            swap(heap[j],heap[u]);
            u=j;
            j=u*2;
        }
        else
            break;
    }
}

void insert(int x)
{
    heap[++n]=x;
    up(n);
}

int getTop()
{
    return heap[1];
}

void deleteTop()
{
    heap[1]=heap[n--];
    down(1);
}

int main()
{
    cin>>m;
    while(m--)
    {
        int op;
        cin>>op;
        if(op == 1)
        {
            int x;
            cin>>x;
            insert(x);
        }
        else if(op == 2)
            cout<<getTop()<<endl;
        else
            deleteTop();
    }
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14520281.html