Pagini recente » Cod sursa (job #1606246) | Cod sursa (job #2690136) | Cod sursa (job #1572166) | Cod sursa (job #750798) | Cod sursa (job #2433482)
#include <iostream>
#include <fstream>
#include <queue>
struct nod
{
long long c;
int l[2];
};
int counttt[1005000];
long long b[1005000];
nod v[2005000];
std::ifstream fin("huffman.in");
std::ofstream fout("huffman.out");
int n;
int countt;
std::queue<int> q1;
std::queue<int> q2;
long long sum;
void get(std::queue<int> & q, int & v1)
{
v1= q.front();
q.pop();
}
inline void travel(int n1,int cc, long long bb)
{
bool ok=false;
for(int i=0;i<2;i++)
if(v[n1].l[i]!=-1)
{
travel(v[n1].l[i],cc+1,(bb<<1)+i);
ok=true;
}
if(!ok)
{
counttt[n1]=cc;
b[n1]=bb;
}
}
int main()
{
fin>>n;
for(int i=0;i<n;i++)
{
int j;
fin>>j;
v[i]={j,{-1,-1}};
q1.push(i);
}
countt=n;
while(!q1.empty() || q2.size()>1)
{
int v1[2];
for(int i=0;i<2;i++)
{
if(q1.empty()|| (!q2.empty() && v[q1.front()].c>v[q2.front()].c))
get(q2,v1[i]);
else
get(q1,v1[i]);
}
long long v0c=v[v1[0]].c;
long long v1c=v[v1[1]].c;
v[countt]={v0c+v1c,{v1[0],v1[1]}};
q2.push(countt);
sum+=v0c+v1c;
countt++;
}
travel(countt-1,0,0);
fout<<sum<<"\n";
for(int i=0;i<n;i++)
fout<<counttt[i]<<" "<<b[i]<<"\n";
}