Cod sursa(job #947569)

Utilizator matei_cChristescu Matei matei_c Data 7 mai 2013 20:05:19
Problema Coduri Huffman Scor 75
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include<fstream>
using namespace std ;

#define maxn 1000001

const long long inf = ( long long ) 1000000000000000000 ;

ifstream fin("huffman.in");
ofstream fout("huffman.out");

struct nod
{
    long long val ;
    long fiu[2] ;
};

nod arb[ 2 * maxn ] ;

long n ;

long coada[2][maxn], st[2], dr[2], lg[maxn] ;

long long b[maxn], sol ;

void dfs(long long poz, long long cod, long long nivel)
{
    if( arb[poz].fiu[0] )
    {
        dfs( arb[poz].fiu[0], cod * 2, nivel + 1 ) ;
        dfs( arb[poz].fiu[1], cod * 2 + 1, nivel + 1 ) ;
        return ;
    }

    lg[poz] = nivel ;
    b[poz] = cod ;
}

void rezolvare()
{
    long unde = n ;
    st[0] = st[1] = 1 ;
    dr[0] = n ;

    while( st[0] + st[1] <= dr[0] + dr[1] )
    {
        ++unde ;

        for(int j = 0; j < 2; ++j )
        {
            long care = 0 ;
            long long minim = inf ;

            for(int i = 0; i < 2; ++i )
            {
                if( arb[ coada[i][ st[i] ] ].val < minim && st[i] <= dr[i] )
                {
                    care = i ;
                    minim = arb[ coada[i][ st[i] ] ].val ;
                }
            }

            arb[unde].fiu[j] = coada[care][ st[care] ] ;
            arb[unde].val += arb[ coada[care][ st[care] ] ].val ;
            ++st[care] ;
        }

        sol += arb[unde].val ;
        coada[1][ ++dr[1] ] = unde ;
    }

    dfs( unde, 0, 0 ) ;
}

void citire()
{
    fin >> n ;

    for(int i = 1; i <= n; ++i )
    {
        fin >> arb[i].val ;
        coada[0][i] = i ;
    }
}

void afisare()
{
    fout << sol << "\n" ;

    for(int i = 1; i <= n; ++i )
        fout << lg[i] << " " << b[i] << "\n" ;
}

int main()
{
    citire() ;

    rezolvare() ;

    afisare() ;

    return 0 ;
}