Cod sursa(job #1243591)

Utilizator ArmandNMArmand Nicolicioiu ArmandNM Data 16 octombrie 2014 01:22:09
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>

const long long inf = 1LL*1000000000*100000000;
const long long NMAX = 1000100;

using namespace std;

struct noduri
{
    long long v;
    int f[2];
};

noduri nod[2*NMAX];

int N,q[2][NMAX];
long long sol,b[NMAX],lg[NMAX],l[2],r[2];


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

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

void solve()
{
    long long m = inf;
    long long p = 0;
    long long k = N;
    l[0]=l[1]=1;
    r[0]=N;

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

    dfs(k,0,0);
}

int main()
{
    freopen("huffman.in", "r", stdin);
    freopen("huffman.out", "w", stdout);
    scanf("%d", &N);
    for (int i = 1; i <= N; ++i)
    {
        scanf("%lld", &nod[i].v);
        q[0][i] = i;
    }

    solve();

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

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

    return 0;
}