Cod sursa(job #1071578)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 3 ianuarie 2014 02:24:20
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <cstring>

#define maxn 1000005
#define inf 1000000001

using namespace std;

ifstream fin("huffman.in");
ofstream fout("huffman.out");

struct tree
{
    int l,r;
}v[2*maxn];

long long q1[maxn],q2[maxn],lg;
long long c[maxn];
int l[maxn],code;
int n,t,s1,s2,lvl;

void new_node (int x, int y)
{
    v[t+n].l = x;
    v[t+n].r = y;
}

void dfs (int x)
{
    if (x <= n)
    {
         c[x] = code;
         l[x] = lvl;
         return;
    }

    code<<=1;
    ++lvl;
    dfs (v[x].l);

    code += 1;
    dfs (v[x].r);

    --lvl;
    code>>=1;
}

int main()
{
    fin>>n;

    memset (q1,1,sizeof(q1));
    memset (q2,1,sizeof(q2));

    for (int i=1; i<=n; ++i)
    {
        fin>>q1[i];
    }

    s1 = 1;
    s2 = 1;
    t = 0;

    while (s1 <= n || s2 < t)
    {
        if (q1[s1] <= q2[s2+1] && q2[s2] <= q1[s1+1])
        {
            q2[++t] = q1[s1] + q2[s2];
            new_node (s1,s2+n);
            ++s1;
            ++s2;
        }
        else if (q1[s1+1] <= q2[s2])
        {
            q2[++t] = q1[s1] + q1[s1+1];
            new_node (s1,s1+1);
            s1 += 2;
        }
        else
        {
            q2[++t] = q2[s2] + q2[s2+1];
            new_node (s2+n,s2+n+1);
            s2 += 2;
        }
        lg += q2[t];
    }

    fout<<lg<<"\n";

    dfs (t+n);

    for (int i=1; i<=n; ++i)
    {
        fout<<l[i]<<" "<<c[i]<<"\n";
    }
}