Cod sursa(job #3127440)

Utilizator dandragosDan Dragos dandragos Data 7 mai 2023 15:34:58
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <stdio.h>
#define MAX_N 1000010

struct TreeNode {
    int cost, left, right;
} tree[MAX_N << 1];

int n, i, node1, node2, q1[MAX_N], q2[MAX_N], r, p, u, l[MAX_N];
long long sum, code[MAX_N];

void add_node() {
    r++;
    tree[r].cost = tree[node1].cost + tree[node2].cost;
    tree[r].left = node1;
    tree[r].right = node2;
}

void dfs(int node, long long cod, int msize) {
    if (tree[node].left == 0) {
        l[node] = msize;
        code[node] = cod;
        return;
    }

    dfs(tree[node].left, cod << 1, msize + 1);
    dfs(tree[node].right, (cod << 1) + 1, msize + 1);
}

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

    scanf("%d", &n);

    for (i = 1; i <= n; i++) {
        scanf("%d", &tree[i].cost);
        q1[i] = i;
    }

    if (n == 1) {
        printf("0\n1 0");
        return 0;
    }

    r = n;
    node1 = 1; 
    node2 = 2;
    add_node();

    i = 3; 
    q2[1] = r; 
    p = u = 1;

    while (i <= n) {
        node1 = q1[i];
        node2 = q2[p];

        if (i + 1 <= n && tree[q1[i + 1]].cost < tree[node2].cost) {
            node2 = q1[i + 1];
            i += 2;
        } else if (p + 1 <= u && tree[q2[p + 1]].cost < tree[node1].cost) {
            node1 = q2[p + 1];
            p += 2;
        } else {
            i++;
            p++;
        }

        add_node();
        q2[++u] = r;
    }

    while (p != u) {
        node1 = q2[p];
        node2 = q2[p + 1];
        p += 2;

        add_node();
        q2[++u] = r;
    }

    dfs(r, 0, 0);

    for (i = 1; i <= n; i++) {
        sum += l[i] * tree[i].cost;
    }

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

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

    return 0;
}