Pagini recente » Cod sursa (job #1764406) | Cod sursa (job #2572802) | Cod sursa (job #668680) | Cod sursa (job #2452882) | Cod sursa (job #2906712)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e6;
int n;
long long ans = 0;
struct node {
long long val;
int left,right,l;
}nodes[NMAX * 2 + 5];
void dfs(int nod, int ll, long long value) {
if (nod > 0) {
nodes[nod].l = ll;
nodes[nod].val = value;
dfs(nodes[nod].left, ll + 1, value << 1);
dfs(nodes[nod].right, ll + 1, (value + 1) << 1);
}
}
void join(int u, int v, int padre) {
nodes[padre].val = nodes[u].val + nodes[v].val;
nodes[padre].left = u;
nodes[padre].right = v;
ans += nodes[padre].val;
}
void huffman() {
int ii = 1,jj = n + 2,m = n + 2,a,b;
nodes[n + 1].val = LONG_LONG_MAX;
while (ii < n || jj < m - 1) {
if (jj < m && nodes[jj].val < nodes[ii].val)
a = jj++;
else
a = ii++;
if (jj < m && nodes[jj].val < nodes[ii].val)
b = jj++;
else
b = ii++;
join(a, b, m);
m++;
}
dfs(m - 1, 0, 0);
}
int main()
{
ifstream fin("huffman.in");
ofstream fout("huffman.out");
fin >> n;
for (int i = 1;i <= n;i++)
fin >> nodes[i].val;
huffman();
fout << ans << '\n';
for (int i = 1;i <= n;i++)
fout << nodes[i].l << " " << nodes[i].val << '\n';
return 0;
}