Pagini recente » Cod sursa (job #3125653) | Cod sursa (job #1814088) | Cod sursa (job #2205341) | Cod sursa (job #118704) | Cod sursa (job #870790)
Cod sursa(job #870790)
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <algorithm>
using namespace std;
#define Nmax 1000010
#define LL long long
int Son[Nmax][2], Length[Nmax], N;
queue<int> Q1, Q2;
LL V[2 * Nmax], ValBin[Nmax], Ans;
void DFS(int Node, int CrtLg, LL CrtBin)
{
if(Son[Node][0])
{
DFS(Son[Node][0], CrtLg + 1, CrtBin * 2);
DFS(Son[Node][1], CrtLg + 1, CrtBin * 2 + 1);
return ;
}
Length[Node] = CrtLg;
ValBin[Node] = CrtBin;
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
int i, j;
scanf("%i", &N);
for(i = 1; i <= N; i++)
{
scanf("%lld", &V[i]);
Q1.push(i);
}
int CrtNode = N + 1;
for(; Q1.size() || Q2.size(); CrtNode ++)
{
bool OK = true;
for(i = 0; i < 2 && OK; i++)
{
int Pos;
if(Q1.size() && Q2.size())
{
if(V[Q1.front()] > V[Q2.front()]) Pos = Q2.front(), Q2.pop();
else Pos = Q1.front(), Q1.pop();
}else if(Q1.size() && !Q2.size()) Pos = Q1.front(), Q1.pop();
else Pos = Q2.front(), Q2.pop();
if(Pos == 0) OK = 0;
V[CrtNode] += V[Pos];
Son[CrtNode][i] = Pos;
}
if(!OK)
{
CrtNode --;
break;
}
Q2.push(CrtNode);
}
DFS(CrtNode, 0, 0);
for(i = 1; i <= N; i++) Ans += 1LL * Length[i] * V[i];
printf("%lld\n", Ans);
for(i = 1; i <= N; i++) printf("%i %lld\n", Length[i], ValBin[i]);
return 0;
}