Cod sursa(job #1580679)

Utilizator aetherAlexandra Vanca aether Data 26 ianuarie 2016 00:05:54
Problema Coduri Huffman Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.51 kb
#include<stdio.h>
#define Nmax 1000010

struct Arb { int cost,st,dr;} A[Nmax<<1];

int n,i,nod1,nod2,Q1[Nmax],Q2[Nmax],R,p,u,L[Nmax];
long long Sum, Cod[Nmax];

void add()
{
    R++;
    A[R].cost = A[nod1].cost + A[nod2].cost;
    A[R].st=nod1;
    A[R].dr=nod2;
}

void dfs (int nod, long long cod, int mSize)
{
    if(A[nod].st==0)
    {
        L[nod]=mSize;
        Cod[nod]=cod;
        return;
    }

    dfs(A[nod].st,cod<<1,mSize+1);
    dfs(A[nod].dr,(cod<<1)+1,mSize+1);
}

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

    scanf("%d",&n);

    for(i=1;i<=n;i++)
    {
        scanf("%d",&A[i].cost);
        Q1[i]=i;
    }

    if(n==1) {printf("0\n1 0"); return 0;}

    R=n;
    nod1=1; nod2=2;
    add();

    i=3; Q2[1]=R; p=u=1;

    while(i<=n)
    {
        nod1=Q1[i];
        nod2=Q2[p];

        if(i+1<=n && A[Q1[i+1]].cost < A[nod2].cost)
        {
            nod2=Q1[i+1];
            i+=2;
        }
        else if(p+1<=u && A[Q2[p+1]].cost < A[nod1].cost)
        {
            nod1=Q2[p+1];
            p+=2;
        }
        else i++,p++;

        add();
        Q2[++u]=R;
    }

    while(p!=u)
    {
        nod1=Q2[p];
        nod2=Q2[p+1];
        p+=2;

        add();
        Q2[++u]=R;
    }

    dfs(R,0,0);

    for(i=1;i<=n;i++)
        Sum+=L[i]*A[i].cost;

    printf("%lld\n",Sum);

    for(i=1;i<=n;i++)
        printf("%d %lld\n",L[i],Cod[i]);
    return 0;
}