Pagini recente » Cod sursa (job #434989) | Cod sursa (job #450996) | Cod sursa (job #260356) | Cod sursa (job #51708) | Cod sursa (job #1767622)
#include <fstream>
#define maxN 1000002
#define inf 1000000000000000000
using namespace std;
int n, l[2], r[2], q[2][maxN], len[maxN];
long long ans, b[maxN];
struct nod
{
long long val;
int son[2];
}v[2 * maxN];
void read()
{
int i;
ifstream in ("huffman.in");
in>>n;
for (i = 1; i <= n; i++)
{
in>>v[i].val;
q[0][i] = i;
}
}
void dfs(int x, long long 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)
{
long long 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;
ofstream out ("huffman.out");
out<<ans<<'\n';
for (i = 1; i <= n; i++)
out<<len[i]<<' '<<b[i]<<'\n';
}
int main()
{
read();
solve();
write();
return 0;
}