Cod sursa(job #528703)

Utilizator DraStiKDragos Oprica DraStiK Data 3 februarie 2011 11:16:26
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <algorithm>
#include <queue>
using namespace std;

#define mp make_pair
#define DIM 1000005
#define sc second
#define fs first

pair <long long,pair <int,int> > nod[DIM<<1];
long long lg_total;
queue <int> q1,q2;
long long b[DIM];
int lg[DIM];
int n,m;

void read ()
{
    int i;

    scanf ("%d",&n);
    for (i=1; i<=n; ++i)
    {
        scanf ("%lld",&nod[i].fs);
        q1.push (i);
    }
}

void df (int ind,long long cod,int lvl)
{
    if (nod[ind].sc.fs && nod[ind].sc.sc)
    {
        df (nod[ind].sc.fs,cod<<1,lvl+1);
        df (nod[ind].sc.sc,(cod<<1)|1,lvl+1);
        return ;
    }
    lg[ind]=lvl; b[ind]=cod;
}

void solve ()
{
    int fiu1,fiu2;
    long long val;

    for (m=n; !q1.empty () || (int)q2.size ()!=1; )
    {
        val=fiu1=fiu2=0;
        if (!q1.empty () && (q2.empty () || nod[q1.front ()].fs<=nod[q2.front ()].fs))
        {
            val+=nod[q1.front ()].fs;
            fiu1=q1.front ();
            q1.pop ();
        }
        else if (!q2.empty ())
        {
            val+=nod[q2.front ()].fs;
            fiu1=q2.front ();
            q2.pop ();
        }
        if (!q1.empty () && (q2.empty () || nod[q1.front ()].fs<=nod[q2.front ()].fs))
        {
            val+=nod[q1.front ()].fs;
            fiu2=q1.front ();
            q1.pop ();
        }
        else if (!q2.empty ())
        {
            val+=nod[q2.front ()].fs;
            fiu2=q2.front ();
            q2.pop ();
        }
        q2.push (++m); lg_total+=val;
        nod[m]=mp (val,mp (fiu1,fiu2));
    }
    df (m,0,0);
}

void print ()
{
    int i;

    printf ("%lld\n",lg_total);
    for (i=1; i<=n; ++i)
        printf ("%d %lld\n",lg[i],b[i]);
}

int main ()
{
    freopen ("huffman.in","r",stdin);
    freopen ("huffman.out","w",stdout);

    read ();
    solve ();
    print ();

    return 0;
}