Cod sursa(job #610766)

Utilizator proflaurianPanaete Adrian proflaurian Data 29 august 2011 09:12:54
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#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;
}