Pagini recente » Cod sursa (job #283286) | Cod sursa (job #1634316) | Cod sursa (job #859443) | Cod sursa (job #1816770) | Cod sursa (job #2290155)
#include <stdio.h>
typedef int T;
const long long WMAX = 1LL * 1000000000 * 1000000000;
const T NMAX = 1000005;
T N;
T q[2][NMAX];
T l[2], r[2]; // capete cozi
T lev[NMAX];
long long code[NMAX];
struct nod {
long long val;
T child[2];
};
nod nodes[NMAX*2];
void dfs(T poz_nod, T level, long long cod) {
if (nodes[poz_nod].child[0]) {
dfs(nodes[poz_nod].child[0], level+1, cod*2);
dfs(nodes[poz_nod].child[1], level+1, cod*2+1);
return;
}
lev[poz_nod] = level;
code[poz_nod] = cod;
}
long long huffman() {
long k = N;
l[0] = l[1] = 1;
r[1] = 0;
r[0] = N;
long long sol = 0;
while (l[0] < r[0] || l[1] < r[1]) {
++k;
for (int i = 0; i < 2; ++i) {
long long mnod_val = WMAX;
int q_ix = -1;
for (int j = 0; j < 2; ++j) {
if (l[j] <= r[j] && nodes[q[j][l[j]]].val < mnod_val) {
mnod_val = nodes[q[j][l[j]]].val;
q_ix = j;
}
}
nodes[k].child[i] = q[q_ix][l[q_ix]];
nodes[k].val += mnod_val;
l[q_ix] += 1;
}
q[1][++r[1]] = k;
sol += nodes[k].val;
}
dfs(k,0,0);
return sol;
}
int main() {
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
scanf("%d", &N);
for (T i = 1; i <= N; ++i) {
scanf("%lld", &nodes[i].val);
q[0][i] = i;
}
long long sol = huffman();
printf("%lld\n", sol);
for (int i = 1; i <= N; ++i) {
printf("%d %lld\n", lev[i], code[i]);
}
fclose(stdin);
fclose(stdout);
}