Cod sursa(job #2068281)

Utilizator victoreVictor Popa victore Data 17 noiembrie 2017 15:28:27
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<bits/stdc++.h>

using namespace std;

const int NMAX = 1e6+5;
const long long INF = 1e18+5;

struct noade
{
    long long v;
    long f[2];
}nod[NMAX<<1];


long n , i , j , k , p , l[2] , r[2] , q[2][NMAX] , lg[NMAX];
long long b[NMAX] , m , sol;

inline void df(long poz , long long cod , long nivel)
{
    if(nod[poz].f[0])
    {
        df(nod[poz].f[0] , (cod<<1) , nivel+1);
        df(nod[poz].f[1] , (cod<<1|1) , nivel+1);
        return;
    }
    lg[poz] = nivel;
    b[poz] = cod;
}

inline void go()
{
    k = n;
    l[0] = l[1] = 1;
    r[0] = n;

    while(l[0] + l[1] <= r[1] + r[0])
    {
        ++k;
        for(j = 0 ; j < 2; ++j)
        {
            p = 0;
            m = INF;
            for(i = 0 ; i < 2; ++i)
            {
                if(nod[ q[i][ l[i] ] ].v < m && l[i] <= r[i])
                {
                    p=i;
                    m = nod[ q[i][ l[i] ] ].v;
                }
            }

            nod[k].f[j] = q[p][ l[p] ];
            nod[k].v += nod[ q[p][ l[p] ] ].v;
            l[p]++;
        }
        sol += nod[k].v;
        q[1][ ++r[1] ] = k;
    }

    df(k , 0 , 0);

}

int main()
{
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);


    scanf("%d",&n);

    for(i=1;i<=n;++i)
    {
        scanf("%d",&nod[i].v);
        q[0][i] = i;
    }
    go();

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

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

    return 0;
}