Cod sursa(job #606536)

Utilizator SpiderManSimoiu Robert SpiderMan Data 4 august 2011 17:51:23
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
# include <algorithm>
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std;

# define x first
# define y second

typedef long long ll;
const char *FIN = "huffman.in", *FOU = "huffman.out";

struct huff {
    ll val;
    pair <int, int> ind;
    void assign (ll vall, pair <int, int> indl) {
        val = vall, ind = indl;
    }
};

bool operator < (const huff& A, const huff& B) {
    return A.val < B.val;
}

huff *Q;
int N, *lun;
ll sol, *base;

void dfs (int i, int lung, ll val) {
    if (Q[i].ind.x + Q[i].ind.y == -2) {
        lun[i] = lung, base[i] = val;
    }
    if (Q[i].ind.x >= 0) dfs (Q[i].ind.x, lung + 1, val << 1);
    if (Q[i].ind.y >= 0) dfs (Q[i].ind.y, lung + 1, val << 1 | 1);
}

inline void doit (pair <int, int> &H, int i, int N) {
    int NL = min (i + 2, N);
    for (int k = i; k < NL; ++k)
        if (H.x == -1 || Q[k] < Q[H.x])
            H.y = H.x, H.x = k;
        else if (H.y == -1 || Q[k] < Q[H.y])
            H.y = k;
}

int main (void) {
    freopen (FIN, "r", stdin);

    scanf ("%d", &N), Q = new huff [N << 1];
    for (int i = 0, x; i < N; ++i) {
        scanf ("%d", &x);
        Q[i].assign (x, make_pair (-1, -1));
    }
    for (int i = 0, j = N, baga = N; baga < (N << 1) - 1; ) {
        pair <int, int> H (-1, -1);
        doit (H, i, N), doit (H, j, baga);
        Q[baga++].assign (Q[H.x].val + Q[H.y].val, H);
        (H.x < N ? ++i : ++j), (H.y < N ? ++i : ++j);
    }
    lun = new int [N], base = new ll [N], dfs ((N << 1) - 2, 0, 0);
    for (int i = N; i < (N << 1) - 1; ++i)
        sol += Q[i].val;

    freopen (FOU, "w", stdout);
    printf ("%lld\n", sol);
    for (int i = 0; i < N; ++i)
        printf ("%d %lld\n", lun[i], base[i]);
}