Pagini recente » Cod sursa (job #3245498) | Cod sursa (job #2724509) | Cod sursa (job #254188) | Cod sursa (job #562459) | Cod sursa (job #2294621)
#include <fstream>
std::ifstream cin("huffman.in");
std::ofstream cout("huffman.out");
#define maxn 1000099
#define inf 0x3f3f3f3f
int lg[maxn],l[2],r[2],k;//l,r indici cozilor,k numarul nodului peste n
long long n,q[2][maxn],b[maxn],SOL;
struct nod{
long long val;
long f[2];
}nod[2*maxn];
void huffman(int,long long,int);
void solve();
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>nod[i].val;
q[0][i]=i;
}
solve();
cout<<SOL<<'\n';
for(int i=1;i<=n;i++)
cout<<lg[i]<<' '<<b[i]<<'\n';
return 0;
}
void huffman(int nodul,long long cod,int nivel)
{
if(nod[nodul].f[0]){
huffman(nod[nodul].f[0],cod*2,nivel+1);
huffman(nod[nodul].f[1],cod*2+1,nivel+1);
return;
}
lg[nodul]=nivel;
b[nodul]=cod;
}
void solve()
{
k=n;
l[0]=l[1]=1;
r[0]=n;
while(l[0]+l[1]<=r[0]+r[1])
{
++k;
for(int i=0;i<2;i++){
long long m=inf,p;
for(int j=0;j<2;j++)
if(nod[q[j][l[j]]].val<m&&l[j]<=r[j])
m=nod[q[j][l[j]]].val,p=j;
nod[k].val+=m;
nod[k].f[i]=q[p][l[p]++];
}
SOL+=nod[k].val;
q[1][++r[1]]=k;
}
huffman(k,0,0);
}