Cod sursa(job #947734)

Utilizator matei_cChristescu Matei matei_c Data 8 mai 2013 12:19:34
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include<cstdio>
using namespace std ;

#define maxn 1000001
#define baza 2

const long long inf = ( long long ) 1000000000000000000 ;

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

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] )
    {
        for(int i = 0; i < baza; ++i )
        {
            long long cod_nou = cod * baza + i ;
            dfs( arb[poz].fiu[i], cod_nou, nivel + 1 ) ;
        }

        return ;
    }

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

void rezolvare()
{
    long unde = n ;

    long long S = baza ;
    long long D = n ;

    for(int i = 0; i < baza; ++i )
        st[i] = 1 ;

    dr[0] = n ;

    while( S <= D )
    {
        ++unde ;

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

            for(int i = 0; i < baza; ++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[ baza - 1 ][ ++dr[ baza - 1 ] ] = unde ;

        S += baza ;
        ++D ;
    }

    dfs( unde, 0, 0 ) ;
}

void citire()
{
    freopen("huffman.in", "r", stdin);

    scanf("%d", &n);

    for(int i = 1; i <= n; ++i )
    {
        scanf("%d", &arb[i].val);
        coada[0][i] = i ;
    }
}

void afisare()
{
    freopen("huffman.out", "w", stdout);

    printf("%lld\n", sol);

    for(int i = 1; i <= n; ++i )
        printf("%d %lld\n", lg[i], b[i]);
}

int main()
{
    citire() ;

    rezolvare() ;

    afisare() ;

    return 0 ;
}