Pagini recente » Cod sursa (job #1109628) | Cod sursa (job #1733134) | Cod sursa (job #1362666) | Cod sursa (job #282043) | Cod sursa (job #1105524)
#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];
long long F[2*NMax],Sol,C[2*NMax];
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();
else
A=0;
if(!Q2.empty())
B=Q2.front();
else
B=0;
if(F[A]<=F[B])
{
Q1.pop();
return A;
}
else
{
if(!Q2.empty())
Q2.pop();
return B;
}
return 0;
}
void DFS(int Nod,int Level, long long 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()
{
F[0]=oo;
for(Nr=N;!Q1.empty()||Q2.size()>1;)
{
++Nr;
int A=Pop(),B=Pop();
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;
}