Cod sursa(job #870814)

Utilizator visanrVisan Radu visanr Data 3 februarie 2013 22:56:55
Problema Coduri Huffman Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

#define Nmax 1000010
#define LL long long

int Son[2 * Nmax][2], Length[Nmax], N;
int Q[2][Nmax], Start[2], End[2];
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;
    Start[0] = Start[1] = 1;
    End[0] = End[1] = 0;
    for(i = 1; i <= N; i++)
    {
        cin >> V[i];
        Q[0][++End[0]] = i;
    }
    int CrtNode = N;
    while(Start[0] + Start[1] <= End[0] + End[1])
    {
        CrtNode ++;
        for(i = 0; i < 2; i++)
        {
            int Pos = -1, QIdx;
            for(j = 0; j < 2; j++)
                if(Start[j] <= End[j] && (Pos == -1 || V[Pos] > V[Q[j][Start[j]]]))
                {
                    Pos = Q[j][Start[j]];
                    QIdx = j;
                }
            Start[QIdx] ++;
            V[CrtNode] += V[Pos];
            Son[CrtNode][i] = Pos;
        }
        Q[1][++End[1]] = 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;
}