Cod sursa(job #927150)

Utilizator andrettiAndretti Naiden andretti Data 25 martie 2013 17:00:21
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include<stdio.h>
#include<queue>
#define maxn 1000005
using namespace std;

struct nod{long long int f;int st,dr;} v[maxn*2];
int n,m;
long long int l[maxn],cod[maxn],s;
queue <int> q1,q2;

void cit()
{
    int i;

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

void create_tree()
{
    int min1,min2;

    while(q1.size()+q2.size()>1)
    {
        if(q1.empty()) {min1=q2.front(); q2.pop(); min2=q2.front(); q2.pop();}
        else
            if(q2.empty()) { min1=q1.front(); q1.pop(); min2=q1.front(); q1.pop();}
            else
            {
                if(v[q1.front()].f<=v[q2.front()].f) min1=q1.front(),q1.pop();
                else min1=q2.front(),q2.pop();

                if(q1.empty()) min2=q2.front(),q2.pop();
                else
                 if(q2.empty()) min2=q1.front(),q1.pop();
                 else
                   if(v[q1.front()].f<=v[q2.front()].f) min2=q1.front(),q1.pop();
                   else
                    min2=q2.front(),q2.pop();
            }

        m++;
        v[m].f=v[min1].f+v[min2].f;
        v[m].st=min1; v[m].dr=min2;
        q2.push(m);
   }
}

void df(int k,long long int cd,long long int niv)
{
    if(v[k].st)
    {
        df(v[k].st,cd*2,niv+1);
        df(v[k].dr,cd*2+1,niv+1);
    }
    else
    {
        l[k]=niv;
        cod[k]=cd;
        s+=(niv*v[k].f);
    }
}

void afis()
{
    int i;

//for(i=1;i<=m;i++) printf("%lld %d %d\n ",v[i].f,v[i].st,v[i].dr);
    printf("%lld\n",s);
    for(i=1;i<=n;i++) printf("%lld %lld\n",l[i],cod[i]);
}


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

    cit();
    create_tree();

    df(m,0,0);
    afis();

    fclose(stdin);
    fclose(stdout);
    return 0;
}