Pagini recente » Cod sursa (job #2496765) | Cod sursa (job #1069539) | Cod sursa (job #246261) | Borderou de evaluare (job #804560) | Cod sursa (job #2294629)
#include <fstream>
std::ifstream cin("huffman.in");
std::ofstream cout("huffman.out");
#define maxn 1000099
#define inf 1LL * 1000000000 * 1000000000
long long b[maxn],SOL;
int lg[maxn],l[2],r[2];
int n,q[2][maxn],k;
struct nod{
long long val;
int f[2];
}nod[2*maxn];
void huffman(long,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(long 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()
{
int i,j,p;
long long m;
k=n;
l[0]=l[1]=1;
r[0]=n;
while(l[0]+l[1]<=r[0]+r[1])
{
++k;
for(i=0;i<2;i++){
m=inf,p=0;
for(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);
}