Pagini recente » Cod sursa (job #524828) | Cod sursa (job #2250164) | Cod sursa (job #2447068) | Cod sursa (job #1208845) | Cod sursa (job #2972892)
#include <fstream>
#include <queue>
using namespace std;
ifstream in ("huffman.in");
ofstream out ("huffman.out");
const long long max_size = 1e6 + 1, INF = 1e18 + 1;
struct str{
long long val;
int nod, st, dr;
};
long long n;
str a[2 * max_size];
queue <int> q[2];
long long mn ()
{
long long ind1, ind2;
if (q[0].empty())
{
ind1 = 0;
}
else
{
ind1 = q[0].front();
}
if (q[1].empty())
{
ind2 = 0;
}
else
{
ind2 = q[1].front();
}
if (a[ind1].val < a[ind2].val)
{
q[0].pop();
return ind1;
}
q[1].pop();
return ind2;
}
void dfs (long long nod, long long depth, long long cod)
{
if (nod <= n)
{
a[nod].val = cod;
a[nod].nod = depth;
return;
}
dfs(a[nod].st, depth + 1, 2 * cod);
dfs(a[nod].dr, depth + 1, 2 * cod + 1);
}
signed main ()
{
a[0].val = INF;
in >> n;
for (long long i = 1; i <= n; i++)
{
in >> a[i].val;
a[i].nod = i;
q[0].push(i);
}
long long ind = n + 1, lg = 0;
while (q[0].size() + q[1].size() > 1)
{
long long x = mn(), y = mn();
a[ind] = {a[x].val + a[y].val, ind, x, y};
q[1].push(ind);
lg += a[ind].val;
ind++;
}
out << lg << '\n';
dfs(ind - 1, 0, 0);
for (long long i = 1; i <= n; i++)
{
out << a[i].nod << " " << a[i].val << '\n';
}
in.close();
out.close();
return 0;
}