Cod sursa(job #1073526)

Utilizator CatalinaRaduCatalina Elena Radu CatalinaRadu Data 6 ianuarie 2014 15:06:06
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>

using namespace std;

#define MaxN 1000100
#define inf 1LL * 1000000000 * 1000000000

ifstream f ("huffman.in");
ofstream g ("huffman.out");

struct nod
{
    long long v;
    long x[2];
}nod[2*MaxN];

long n,i,j,k,p, l[2], r[2];
long long q[2][MaxN],lung[MaxN];
long baza[MaxN],minim,lmax;

void depthf (long pos, long long cod, long nivel)
{
    if (nod[pos].x[0])
    {
        depthf(nod[pos].x[0],cod*2,nivel+1);
        depthf(nod[pos].x[0],cod*2+1,nivel+1);
        return;

    }
    lung[pos]=nivel;
    baza[pos]=cod;
}

void solve()
{
    k=n;
    l[0]=l[1]=1;
    r[0]=n;
    while(l[0]+l[1]<=r[0]+r[1])
    {
        k++;
        for (j=0;j<2;j++)
        {
            p=0;
            minim=inf;
            for(i=0;i<2;i++)
            {
                if(nod[q[i][l[i]]].v<minim && l[i]<=r[i])
                {
                    p=i;
                    minim=nod[q[i][l[i]]].v;
                }

            }
            nod[k].x[j]=q[p][l[p]];
            nod[k].v+=nod[q[p][l[p]]].v;
        }
        lmax+=nod[k].v;
        q[1][++r[1]]=k;
    }
    depthf(k,0,0);
}

int main()
{
    f>>n;
    for (i=1;i<=n;i++)
    {
        f>>nod[i].v;
        q[0][i]=i;
    }
    solve();
    g<<lmax<<'\n';
    for(i=1;i<=n;i++)
        g<<lung[i]<<' '<<baza[i]<<'\n';
    f.close();
    g.close();
    return 0;
}