Cod sursa(job #848933)

Utilizator enedumitruene dumitru enedumitru Data 5 ianuarie 2013 21:52:05
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#define Nmax 1000002
#define oo 1LL*(1<<30)
#define ll long long
using namespace std;
ifstream in("huffman.in"); ofstream g("huffman.out");
struct arbore
    {int fiu[2]; ll frecv;} nod[2*Nmax];
int n, nr, LG[Nmax], Q[2][Nmax], L[2], R[2];
ll sol,B[Nmax];
inline void dfs(int i, ll config, int nivel)
{   if(nod[i].fiu[0])
        { dfs(nod[i].fiu[0],(config<<1),nivel+1);
          dfs(nod[i].fiu[1],(config<<1)+1,nivel+1);
          return;
        }
    B[i]=config; LG[i]=nivel;
}
inline void pop(int &x)
{   if(nod[Q[0][L[0]]].frecv<nod[Q[1][L[1]]].frecv)
        x=Q[0][L[0]++]; else x=Q[1][L[1]++];
}
int main()
{   int a,b;
    in>>n;
    for(int i=1; i<=n; i++) {in>>nod[i].frecv; Q[0][i]=i;}
    L[0]=L[1]=1;
    R[0]=n;
    R[1]=0;
    nr=n;
    nod[0].frecv=oo*oo;
    while(L[0]<=R[0]||L[1]<R[1])
    {   pop(a); pop(b);
        ++nr;
        nod[nr].fiu[0]=a; nod[nr].fiu[1]=b;
        nod[nr].frecv=nod[a].frecv+nod[b].frecv;
        sol+=nod[nr].frecv;
        Q[1][++R[1]]=nr;
    }
    dfs(nr,0,0);
    g<<sol<<'\n';
    for(int i=1; i<=n; i++) g<<LG[i]<<' '<<B[i]<<'\n';
    g.close();
    return 0;
}