Cod sursa(job #1222887)

Utilizator nicol.bolasNicol Bolas nicol.bolas Data 24 august 2014 17:53:24
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include<fstream>
using namespace std;
#define NMAX 1000005
ifstream fin("huffman.in");
ofstream fout("huffman.out");
struct nod
{
    long long v;
    int f[2];
} A[NMAX<<1];
int n,k,n1,n2,x1,x2,B[NMAX];
long long lg,C[NMAX];
void dfs(int nod, int x, long long y)
{
    if (nod<=n)
        B[nod]=x, C[nod]=y;
    else
    {
        dfs(A[nod].f[0],x+1,y<<1);
        dfs(A[nod].f[1],x+1,(y<<1)+1);
    }
}
int main()
{
    int i;
    fin>>n;
    for (i=1;i<=n;++i)
        fin>>A[i].v;
    A[n+1].v=A[1].v+A[2].v;
    A[n+1].f[0]=1, A[n+1].f[1]=2;
    lg=A[n+1].v;
    n1=3, n2=n+1;
    for (k=n+2;k<2*n;++k)
    {
        if (n1<n && n2<k-1)
        {
            x1=n1, x2=n2;
            if (A[n1].v+A[n1+1].v<A[x1].v+A[x2].v)
                x1=n1, x2=n1+1;
            if (A[n2].v+A[n2+1].v<A[x1].v+A[x2].v && n2<k)
                x1=n2, x2=n2+1;
            A[k].v=A[x1].v+A[x2].v;
            A[k].f[0]=x1, A[k].f[1]=x2;
            if (x1<n2) ++n1;
            else ++n2;
            if (x2<n2) ++n1;
            else ++n2;
        }
        else
        {
            if (n2>=k)
            {
                A[k].v=A[n1].v+A[n1+1].v;
                A[k].f[0]=n1, A[k].f[1]=n1+1;
                ++n1, ++n1;
                goto add;
            }
            if (n1>n)
            {
                A[k].v=A[n2].v+A[n2+1].v;
                A[k].f[0]=n2, A[k].f[1]=n2+1;
                ++n2, ++n2;
                goto add;
            }
            x1=n1, x2=n2;
            if (A[n2].v+A[n2+1].v<A[x1].v+A[x2].v && n2<k-1)
                x1=n2, x2=n2+1;
            if (A[n1].v+A[n1+1].v<A[x1].v+A[x2].v && n1<n)
                x1=n1, x2=n1+1;
            A[k].v=A[x1].v+A[x2].v;
            A[k].f[0]=x1, A[k].f[1]=x2;
            if (x1<n2) ++n1;
            else ++n2;
            if (x2<n2) ++n1;
            else ++n2;
        }
        add: lg+=A[k].v;
    }
    fout<<lg<<"\n";
    dfs(2*n-1,0,0);
    for (i=1;i<=n;++i)
        fout<<B[i]<<" "<<C[i]<<"\n";
    return 0;
}