Cod sursa(job #1747714)

Utilizator akaprosAna Kapros akapros Data 25 august 2016 14:41:16
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#define maxN 1000002
#define ll long long
#define inf 1000000000000000000
using namespace std;
int n, l[2], r[2], q[2][maxN], len[maxN];
ll ans, b[maxN];
struct nod
{
    ll val;
    int son[2];
}v[2 * maxN];
void read()
{
    int i;
    freopen("huffman.in", "r", stdin);
    scanf("%d", &n);
    for (i = 1; i <= n; ++ i)
    {
        scanf("%lld", &v[i].val);
        q[0][i] = i;
    }
}
void dfs(int x, ll cod, int lvl)
{
    if (v[x].son[0])
       {
           dfs(v[x].son[0], 2LL * cod, lvl + 1);
       dfs(v[x].son[1], 2LL * cod + 1, lvl + 1);
       return ;
       }
    b[x] = cod;
    len[x] = lvl;
}
void solve()
{
    l[0] = l[1] = 1;
    r[0] = n;
    int k = n;
    while (l[0] + l[1] <= r[0] + r[1])
    {
        int i, j;
        ++ k;
        for (i = 0; i < 2; ++ i)
        {
            ll mval = inf;
            int pos = 0;
            for (j = 0; j < 2; ++ j)
                if (l[j] <= r[j] && v[q[j][l[j]]].val < mval)
            {
                mval = v[q[j][l[j]]].val;
                pos = j;
            }

            v[k].son[i] = q[pos][l[pos]];
            v[k].val += mval;
            ++ l[pos];
        }
        q[1][++ r[1]] = k;
        ans += v[k].val;
    }
    dfs(k, 0LL, 0);
}
void write()
{
    int i;
    freopen("huffman.out", "w", stdout);
    printf("%lld\n", ans);
    for (i = 1; i <= n; ++ i)
        printf("%d %lld\n", len[i], b[i]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}