Pagini recente » Cod sursa (job #2475623) | Cod sursa (job #1785276) | Cod sursa (job #625072) | Cod sursa (job #175016) | Cod sursa (job #870791)
Cod sursa(job #870791)
#include <fstream>
#include <iostream>
#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()
{
ifstream cin("huffman.in");
ofstream cout("huffman.out");
int i, j;
cin >> N;
for(i = 1; i <= N; i++)
{
cin >> 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 = 0;
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 if(!Q1.size() && Q2.size()) 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];
cout << Ans << "\n";
for(i = 1; i <= N; i++) cout << Length[i] << " " << ValBin[i] << "\n";
return 0;
}