Pagini recente » Cod sursa (job #2179851) | Cod sursa (job #2790095) | Cod sursa (job #272260) | Cod sursa (job #3201711) | Cod sursa (job #1105502)
#include <fstream>
#define NMax 1000005
#define oo (1<<30)
#include <queue>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int Fiu[2*NMax][2];
queue <int> Q1,Q2;
int N,Nr,L[2*NMax],C[2*NMax];
long long F[2*NMax],Sol;
void Read()
{
fin>>N;
for(int i=1;i<=N;i++)
{
fin>>F[i];
Q1.push(i);
}
}
inline int Pop()
{
int A,B;
if(!Q1.empty())
{
A=Q1.front();
if(!Q2.empty())
{
B=Q2.front();
if(F[A]<=F[B])
return A;
else
return B;
}
else
return A;
}
else
{
if(!Q2.empty())
{
B=Q2.front();
return B;
}
else
return 0;
}
}
void DFS(int Nod,int Level, int Code)
{
if(Fiu[Nod][0])
{
DFS(Fiu[Nod][0],Level+1,Code<<1);
DFS(Fiu[Nod][1],Level+1,(Code<<1)+1);
}
L[Nod]=Level;
C[Nod]=Code;
}
void Solve()
{
int A,B;
for(Nr=N;(A=Pop())&&(B=Pop());)
{
++Nr;
Q2.push(Nr);
Fiu[Nr][0]=A;
Fiu[Nr][1]=B;
F[Nr]=F[A]+F[B];
Sol+=F[Nr];
}
DFS(Nr,0,0);
}
void Print()
{
fout<<Sol<<"\n";
for(int i=1;i<=N;i++)
fout<<L[i]<<" "<<C[i]<<"\n";
}
int main()
{
Read();
Solve();
Print();
return 0;
}