Cod sursa(job #1071581)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 3 ianuarie 2014 02:32:49
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <cstring>

#define maxn 1000005
#define inf 1000000001

using namespace std;

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

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

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

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

    dfs (v[x].l,code<<1,lvl+1);
    dfs (v[x].r,(code<<1)+1,lvl+1);
}

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

    scanf ("%d",&n);

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

    for (int i=1; i<=n; ++i)
    {
        scanf ("%lld",&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 if (q2[s2+1] <= q1[s1])
        {
            q2[++t] = q2[s2] + q2[s2+1];
            new_node (s2+n,s2+n+1);
            s2 += 2;
        }
        lg += q2[t];
    }

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

    dfs (t+n,0,0);

    for (int i=1; i<=n; ++i)
    {
        printf ("%d %lld\n",l[i],c[i]);
    }
}