Pagini recente » Atasamentele paginii Profil radubetter | Cod sursa (job #1843589) | Cod sursa (job #1796607) | Cod sursa (job #1695408) | Cod sursa (job #1747714)
#include <bits/stdc++.h>
#define maxN 1000002
#define ll long long
#define inf 1000000000000000000
using namespace std;
int n, l[2], r[2], q[2][maxN], len[maxN];
ll ans, b[maxN];
struct nod
{
ll val;
int son[2];
}v[2 * maxN];
void read()
{
int i;
freopen("huffman.in", "r", stdin);
scanf("%d", &n);
for (i = 1; i <= n; ++ i)
{
scanf("%lld", &v[i].val);
q[0][i] = i;
}
}
void dfs(int x, ll cod, int lvl)
{
if (v[x].son[0])
{
dfs(v[x].son[0], 2LL * cod, lvl + 1);
dfs(v[x].son[1], 2LL * cod + 1, lvl + 1);
return ;
}
b[x] = cod;
len[x] = lvl;
}
void solve()
{
l[0] = l[1] = 1;
r[0] = n;
int k = n;
while (l[0] + l[1] <= r[0] + r[1])
{
int i, j;
++ k;
for (i = 0; i < 2; ++ i)
{
ll mval = inf;
int pos = 0;
for (j = 0; j < 2; ++ j)
if (l[j] <= r[j] && v[q[j][l[j]]].val < mval)
{
mval = v[q[j][l[j]]].val;
pos = j;
}
v[k].son[i] = q[pos][l[pos]];
v[k].val += mval;
++ l[pos];
}
q[1][++ r[1]] = k;
ans += v[k].val;
}
dfs(k, 0LL, 0);
}
void write()
{
int i;
freopen("huffman.out", "w", stdout);
printf("%lld\n", ans);
for (i = 1; i <= n; ++ i)
printf("%d %lld\n", len[i], b[i]);
}
int main()
{
read();
solve();
write();
return 0;
}