Cod sursa(job #1222897)

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