Cod sursa(job #870790)

Utilizator visanrVisan Radu visanr Data 3 februarie 2013 22:01:35
Problema Coduri Huffman Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <algorithm>
using namespace std;

#define Nmax 1000010
#define LL long long

int Son[Nmax][2], Length[Nmax], N;
queue<int> Q1, Q2;
LL V[2 * Nmax], ValBin[Nmax], Ans;

void DFS(int Node, int CrtLg, LL CrtBin)
{
    if(Son[Node][0])
    {
        DFS(Son[Node][0], CrtLg + 1, CrtBin * 2);
        DFS(Son[Node][1], CrtLg + 1, CrtBin * 2 + 1);
        return ;
    }
    Length[Node] = CrtLg;
    ValBin[Node] = CrtBin;
}

int main()
{
    freopen("huffman.in", "r", stdin);
    freopen("huffman.out", "w", stdout);
    int i, j;
    scanf("%i", &N);
    for(i = 1; i <= N; i++)
    {
        scanf("%lld", &V[i]);
        Q1.push(i);
    }
    int CrtNode = N + 1;
    for(; Q1.size() || Q2.size(); CrtNode ++)
    {
        bool OK = true;
        for(i = 0; i < 2 && OK; i++)
        {
            int Pos;
            if(Q1.size() && Q2.size())
            {
                if(V[Q1.front()] > V[Q2.front()]) Pos = Q2.front(), Q2.pop();
                else Pos = Q1.front(), Q1.pop();
            }else if(Q1.size() && !Q2.size()) Pos = Q1.front(), Q1.pop();
            else Pos = Q2.front(), Q2.pop();
            if(Pos == 0) OK = 0;
            V[CrtNode] += V[Pos];
            Son[CrtNode][i] = Pos;
        }
        if(!OK)
        {
            CrtNode --;
            break;
        }
        Q2.push(CrtNode);
    }
    DFS(CrtNode, 0, 0);
    for(i = 1; i <= N; i++) Ans += 1LL * Length[i] * V[i];
    printf("%lld\n", Ans);
    for(i = 1; i <= N; i++) printf("%i %lld\n", Length[i], ValBin[i]);
    return 0;
}