堆
今天学了一下手写堆。
不太喜欢,感觉写起来不太方便,再看吧。
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