Pagini recente » Cod sursa (job #2055856) | Cod sursa (job #3223679) | Cod sursa (job #367956) | Statistici Babii Victor Ionut (BabiiVictor) | Cod sursa (job #870814)
Cod sursa(job #870814)
#include <fstream>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
#define Nmax 1000010
#define LL long long
int Son[2 * Nmax][2], Length[Nmax], N;
int Q[2][Nmax], Start[2], End[2];
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;
Start[0] = Start[1] = 1;
End[0] = End[1] = 0;
for(i = 1; i <= N; i++)
{
cin >> V[i];
Q[0][++End[0]] = i;
}
int CrtNode = N;
while(Start[0] + Start[1] <= End[0] + End[1])
{
CrtNode ++;
for(i = 0; i < 2; i++)
{
int Pos = -1, QIdx;
for(j = 0; j < 2; j++)
if(Start[j] <= End[j] && (Pos == -1 || V[Pos] > V[Q[j][Start[j]]]))
{
Pos = Q[j][Start[j]];
QIdx = j;
}
Start[QIdx] ++;
V[CrtNode] += V[Pos];
Son[CrtNode][i] = Pos;
}
Q[1][++End[1]] = 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;
}