Cod sursa(job #1166329)

Utilizator darrenRares Buhai darren Data 3 aprilie 2014 14:39:46
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <algorithm>

using namespace std;



int N;
int C[2][2000002], nodnow;
long long val[2000002], lg[2000002], bs[2000002];
int whn[2000002][2];
int pbeg[2], pend[2];

long long lgnow, bsnow;
void Dfs(int nodnow)
{
    if (nodnow <= N)
    {
        lg[nodnow] = lgnow;
        bs[nodnow] = bsnow;
        return;
    }

    ++lgnow;
    bsnow = bsnow * 2;
    Dfs(whn[nodnow][0]);
    bsnow = bsnow + 1;
    Dfs(whn[nodnow][1]);
    bsnow = bsnow / 2;
    --lgnow;
}

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

    scanf("%d", &N);
    for (int i = 1; i <= N; ++i)
    {
        scanf("%lld", &val[i]);
        C[0][i] = i;
    }

    pbeg[0] = 1;
    pend[0] = N;
    pbeg[1] = 1;
    pend[1] = 0;
    nodnow = N;

    while (pend[0] - pbeg[0] + pend[1] - pbeg[1] + 2 >= 2)
    {
        ++nodnow;
        for (int i = 0; i < 2; ++i)
        {
            int now = -1, wh;
            for (int j = 0; j < 2; ++j)
                if (pbeg[j] <= pend[j] && (now == -1 || val[C[j][pbeg[j]]] < val[now]))
                {
                    now = C[j][pbeg[j]];
                    wh = j;
                }

            ++pbeg[wh];
            val[nodnow] += val[now];
            whn[nodnow][i] = now;
        }
        C[1][++pend[1]] = nodnow;
    }

    Dfs(nodnow);

    long long result = 0;
    for (int i = 1; i <= N; ++i)
        result += val[i] * lg[i];
    printf("%lld\n", result);

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