今天学了一下手写堆。

不太喜欢,感觉写起来不太方便,再看吧。

NOIp2004 合并果子

#include <cstdio>
#include <algorithm>
const int N=10010;
int heap[N],tot,ans=0;
void up(int now)
{
    while(now&&heap[now>>1]>heap[now])
        std::swap(heap[now>>1],heap[now]),now>>=1;
}
void insert(int x)
{
    heap[++tot]=x;
    up(tot);
}
void down(int now)
{
    int k=now<<1;
    while(k<=tot)
    {
        if(k<tot&&heap[k]>heap[k|1]) k|=1;
        if(heap[k]<heap[now])
            std::swap(heap[k],heap[now]),now=k,k=now<<1;
        else break;
    }
}
void extrack()
{
    heap[1]=heap[tot--];
    down(1);
}
void build()
{
    for(int i=tot/2;i;i--)
        down(i);
}
int main()
{
    scanf("%d",&tot);
    for(int i=1;i<=tot;i++) scanf("%d",heap+i);
    build();
    while(tot>1)
    {
        int t=heap[1];extrack();
        t+=heap[1];extrack();
        insert(t);ans+=t;
    }
    printf("%d\n",ans);
    return 0;
}


2018.6.9

posted @ 2018-06-09 19:48  露迭月  阅读(158)  评论(0编辑  收藏  举报