Pagini recente » Cod sursa (job #2598753) | Cod sursa (job #648481) | Cod sursa (job #288455) | Cod sursa (job #2830615) | Cod sursa (job #2619394)
#include <bits/stdc++.h>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
const int MAX = 2000050;
long long fr[MAX], ln[MAX], b10[MAX], G[MAX][2];
queue <int> Q[3];
int Min()
{
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, long long val, int len)
{
if(G[nod][0] == 0)
{
ln[nod] = len;
b10[nod] = val;
return;
}
dfs(G[nod][0], val << 1LL, len + 1);
dfs(G[nod][1], (val << 1LL) + 1, len + 1);
}
int main()
{
int n;
in >> n;
for(int i = 1; i <= n; i++)
{
in >> fr[i];
Q[1].push(i);
}
int nr = n;
long long lg = 0;
while((Q[1].size() + Q[2].size()) != 1)
{
int len = Min();
int r = Min();
Q[2].push(++nr);
fr[nr] = fr[len] + fr[r];
lg += fr[nr];
G[nr][0] = len;
G[nr][1] = r;
}
dfs(nr, 0, 0);
out << lg << "\n";
for(int i = 1; i <= n; i++)
out << ln[i] << " " << b10[i] << "\n";
return 0;
}