Pagini recente » Benzina | Cod sursa (job #691898) | Statistici Vartic Rihard (Stormtrooper-007) | Monitorul de evaluare | Cod sursa (job #1712879)
#include <fstream>
#include <iostream>
#include <queue>
#include <limits>
using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");
#define NMAX 1000000
#define ll long long
int n, nodes, pos, qOrd, len[NMAX];
ll res, value, b[NMAX];
queue<int> q[2];
struct Node
{
ll value;
int posOfSon[2];
} v[NMAX * 2];
void dfs(int pos, ll code, int level)
{
cout<<"ok";
if (v[pos].posOfSon[0])
{
dfs(v[pos].posOfSon[0], code * 2, level + 1);
dfs(v[pos].posOfSon[1], code * 2 + 1, level + 1);
return;
}
b[pos] = code;
len[pos] = level;
}
int main()
{
f >> n;
for (int i = 1;i <= n;i++)
{
f >> v[i].value;
q[0].push(i);
}
nodes = n;
while (q[0].size() + q[1].size() > 1)
{
nodes++;
for (int j = 0;j < 2;j++)
{
value = numeric_limits<ll>::max();
for (int i = 0;i < 2;i++)
if (!q[i].empty() && value > v[q[i].front()].value)
{
pos = q[i].front();
value = v[pos].value;
qOrd = i;
}
q[qOrd].pop();
v[nodes].posOfSon[j] = pos;
v[nodes].value += value;
}
q[1].push(nodes);
res += v[nodes].value;
}
dfs(nodes, 0, 0);
g << res << '\n';
for (int i = 1;i <= n;i++)
g << len[i] << " " << b[i]<<'\n';
}