Cod sursa(job #792121)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 26 septembrie 2012 15:47:27
Problema Coduri Huffman Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <cstdio>
#define MAX 1048576
#define INF ((1LL << 62) - 1)

using namespace std;

struct nod
{
    long long v;
    int f[2];
}nod[2 * MAX];

long long sol, b[MAX], minim;
int l[2], r[2], q[2][MAX], n, k, p, lgt[MAX], now;
char s[1 << 18];
ifstream in("huffman.in");

void verify()
{
    if(!s[now])
    {
        in.get(s, 1 << 18, '\0');
        now = 0;
    }
}

int get()
{
    int nr = 0;
    while(!isdigit(s[now])) now++, verify();
    while(isdigit(s[now]))
        nr = nr * 10 + s[now] - '0', now++;
    return nr;
}

void dfs(int nd, long long cod, int l)
{
    if(nod[nd].f[0])
    {
        dfs(nod[nd].f[0], cod * 2, l + 1);
        dfs(nod[nd].f[1], cod * 2 + 1, l + 1);
        return;
    }
    b[nd] = cod;
    lgt[nd] = l;
}

void solve()
{
    k = n;
    l[0] = l[1] = 1;
    r[0] = n;
    while(l[0] + l[1] <= r[0] + r[1])
    {
        k++;
        for(int i = 0; i < 2; i++)
        {
            p = 0; minim = INF;
            for(int j = 0; j < 2; j++)
            {
                if(l[j] <= r[j] && nod[q[j][l[j]]].v < minim)
                {
                    minim = nod[q[j][l[j]]].v;
                    p = j;
                }
            }
            nod[k].f[i] = q[p][l[p]];
            nod[k].v += nod[q[p][l[p]++]].v;
        }
        sol += nod[k].v;
        q[1][++r[1]] = k;
    }
    dfs(k, 0, 0);
}

int main()
{
    verify();
    n = get();
    for(int i = 1; i <= n; i++)
    {
        nod[i].v = get();
        q[0][i] = i;
    }
    in.close();
    solve();
    freopen("huffman.out", "w", stdout);
    printf("%lld\n", sol);
    for(int i = 1; i <= n; i++)
        printf("%d %lld\n", lgt[i], b[i]);
    fclose(stdout);
    return 0;
}