Cod sursa(job #1849918)

Utilizator proflaurianPanaete Adrian proflaurian Data 17 ianuarie 2017 22:53:14
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 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;
}