Pagini recente » Cod sursa (job #774625) | Cod sursa (job #2495708) | Cod sursa (job #1433564) | Cod sursa (job #1475552) | Cod sursa (job #610766)
Cod sursa(job #610766)
#include<stdio.h>
#define N 2000011
#define bb {F[++T]=F[b]+F[b+1];sol+=F[T];S[T]=b;D[T]=b+1;b+=2;}
#define BB {F[++T]=F[B]+F[B+1];sol+=F[T];S[T]=B;D[T]=B+1;B+=2;}
#define bB {F[++T]=F[b]+F[B];sol+=F[T];S[T]=b;D[T]=B;b++;B++;}
int n,i,j,k,b,B,t,T,S[N],D[N],L[N];
long long sol,F[N],C[N];
void read(),solve();
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%lld",&F[i]);
sol=F[n+1]=F[1]+F[2];
S[n+1]=1;D[n+1]=2;
b=3;t=n;B=T=n+1;
for(;b<t;)
{
if(B<T)
{
if(F[b+1]<=F[B])bb
else if(F[B+1]<=F[b])BB
else bB
}
else if(B==T)
{
if(F[b+1]<=F[B]) bb
else bB
}
else bb;
}
for(;b==t&&B<=T;)
{
if(B<T)
{
if(F[B+1]<=F[b]) BB
else bB
}
else bB;
}
for(;B<T;)BB
printf("%lld\n",sol);
for(i=T;i>n;i--){L[S[i]]=L[D[i]]=L[i]+1;C[S[i]]=2*C[i];C[D[i]]=2*C[i]+1;}
for(i=1;i<=n;i++)printf("%d %lld\n",L[i],C[i]);
return 0;
}