Pagini recente » Cod sursa (job #3040089) | Paginatie | jc2019/runda-1 | Cod sursa (job #2439856) | Cod sursa (job #3127440)
#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;
}