Cod sursa(job #952619)

Utilizator primulDarie Sergiu primul Data 23 mai 2013 19:01:42
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 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 ;
}