Pagini recente » Cod sursa (job #3288108) | Cod sursa (job #2315888) | Cod sursa (job #2668009) | Cod sursa (job #2672509) | Cod sursa (job #2627765)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("huffman.in");
ofstream g ("huffman.out");
typedef long long ll;
const int nmax = 2e6 + 3;
ll fr[nmax], ln[nmax], sol[nmax], v[nmax][2];
queue <int> q[3];
int solve()
{
int x;
if(q[1].empty())
{
x = q[2].front();
q[2].pop();
return x;
}
if(q[2].empty())
{
x = q[1].front();
q[1].pop();
return x;
}
if(fr[q[1].front()] <= fr[q[2].front()])
{
x = q[1].front();
q[1].pop();
return x;
}
x = q[2].front();
q[2].pop();
return x;
}
void dfs(int nod, ll val, int len)
{
if(!v[nod][0])
{
ln[nod] = len;
sol[nod] = val;
return;
}
dfs(v[nod][0], 2ll * val, len + 1);
dfs(v[nod][1], 2ll * val + 1, len + 1);
}
int main()
{
int n;
f >> n;
for(int i = 1; i <= n; ++i)
{
f >> fr[i];
q[1].push(i);
}
int nr = n;
ll lg = 0;
while((q[1].size() + q[2].size()) != 1)
{
int len = solve();
int r = solve();
q[2].push(++nr);
fr[nr] = fr[len] + fr[r];
lg += fr[nr];
v[nr][0] = len;
v[nr][1] = r;
}
dfs(nr, 0, 0);
g << lg << '\n';
for(int i = 1; i <= n; ++i) g << ln[i] << ' ' << sol[i] << '\n';
return 0;
}