Cod sursa(job #870791)

Utilizator visanrVisan Radu visanr Data 3 februarie 2013 22:04:33
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <iostream>
#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()
{
    ifstream cin("huffman.in");
    ofstream cout("huffman.out");
    int i, j;
    cin >> N;
    for(i = 1; i <= N; i++)
    {
        cin >> 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 = 0;
            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 if(!Q1.size() && Q2.size()) 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];
    cout << Ans << "\n";
    for(i = 1; i <= N; i++) cout << Length[i] << " " << ValBin[i] << "\n";
    return 0;
}