Cod sursa(job #1166326)

Utilizator darrenRares Buhai darren Data 3 aprilie 2014 14:37:48
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 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 beg[2], end[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("%I64d", &val[i]);
        C[0][i] = i;
    }

    beg[0] = 1;
    end[0] = N;
    beg[1] = 1;
    end[1] = 0;
    nodnow = N;

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

            ++beg[wh];
            val[nodnow] += val[now];
            whn[nodnow][i] = now;
        }
        C[1][++end[1]] = nodnow;
    }

    Dfs(nodnow);

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

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