Pagini recente » Cod sursa (job #2812162) | Cod sursa (job #1383032) | Cod sursa (job #2235202) | Cod sursa (job #1594658) | Cod sursa (job #2103667)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
const long long NMAX = 1000000;
const long long INF = 1LL * 1e18;
struct Tree {
long long v;
long long son[2];
};
long long n;
long long q[2][1 + NMAX];
long long len[1 + NMAX];
long long no[1 + NMAX];
long long res;
Tree arb[1 + 2 * NMAX];
void dfs(long long pos, long long code, long long level) {
if(arb[pos].son[0] != 0) {
dfs(arb[pos].son[0], code * 2, level + 1);
dfs(arb[pos].son[1], code * 2 + 1, level + 1);
}
len[pos] = level;
no[pos] = code;
}
void solve() {
long long l[2] = {1, 1};
long long r[2] = {n, 0};
long long x = n;
while(l[0] + l[1] <= r[0] + r[1]) {
x++;
for(long long i = 0; i <= 1; i++) {
long long p = 0;
long long sz = INF;
for(long long j = 0; j <= 1; j++) {
if(arb[q[j][l[j]]].v < sz && l[j] <= r[j]) {
p = j;
sz = arb[q[j][l[j]]].v;
}
}
arb[x].son[i] = q[p][l[p]];
arb[x].v += arb[q[p][l[p]]].v;
l[p]++;
}
res += arb[x].v;
q[1][++r[1]] = x;
}
dfs(x, 0, 0);
}
int main()
{
in >> n;
for(long long i = 1; i <= n; i++) {
in >> arb[i].v;
q[0][i] = i;
}
solve();
out << res << '\n';
for(long long i = 1; i <= n; i++) {
out << len[i] << ' ' << no[i] << '\n';
}
in.close();
out.close();
return 0;
}