Cod sursa(job #1105524)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 11 februarie 2014 20:54:15
Problema Coduri Huffman Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#define NMax 1000005
#define oo (1<<30)
#include <queue>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");

int Fiu[2*NMax][2];
queue <int> Q1,Q2;
int N,Nr,L[2*NMax];
long long F[2*NMax],Sol,C[2*NMax];
void Read()
{
    fin>>N;
    for(int i=1;i<=N;i++)
         {
            fin>>F[i];
            Q1.push(i);
         }
}

inline int Pop()
{
    int A,B;
   if(!Q1.empty())
        A=Q1.front();
    else
        A=0;

   if(!Q2.empty())
        B=Q2.front();
    else
        B=0;
   if(F[A]<=F[B])
    {
        Q1.pop();
        return A;
    }
    else
    {
        if(!Q2.empty())
            Q2.pop();
        return B;
    }
return 0;
}

void DFS(int Nod,int Level, long long Code)
{
    if(Fiu[Nod][0])
    {
        DFS(Fiu[Nod][0],Level+1,Code<<1);
        DFS(Fiu[Nod][1],Level+1,(Code<<1)+1);
    }

    L[Nod]=Level;
    C[Nod]=Code;
}

void Solve()
{
    F[0]=oo;
    for(Nr=N;!Q1.empty()||Q2.size()>1;)
        {
            ++Nr;
            int A=Pop(),B=Pop();
            Q2.push(Nr);
            Fiu[Nr][0]=A;
            Fiu[Nr][1]=B;
            F[Nr]=F[A]+F[B];
            Sol+=F[Nr];
        }
    DFS(Nr,0,0);
}

void Print()
{
    fout<<Sol<<"\n";
    for(int i=1;i<=N;i++)
            fout<<L[i]<<" "<<C[i]<<"\n";
}

int main()
{
    Read();
    Solve();
    Print();
    return 0;
}