Pagini recente » Rating Florin Anton (FlorinAnton) | Cod sursa (job #2202982) | Cod sursa (job #1174256) | Cod sursa (job #2423783) | Cod sursa (job #590384)
Cod sursa(job #590384)
#include <stdio.h>
int q1[1000001],q2[1000001],n,i,j,lg[1000001];
long long sol,b[1000001];
struct nod{long long v; int f[2];};
nod G[2000001];
int df(int k,long long cod,int lev)
{
if (G[k].f[0])
{
df(G[k].f[0],cod*2,lev+1);
df(G[k].f[1],cod*2+1,lev+1);
return 0;
}
lg[k]=lev;
b[k]=cod;
return 0;
}
int main(void)
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%lld",&G[i].v);
q1[i]=i;
q1[0]++;
}
i=j=1;
int k=n;
while (i+j<=q1[0]+q2[0])
{
++k;
if ((G[q1[i]].v<G[q2[j]].v && i<=q1[0]) || j>q2[0])
{
G[k].f[0]=q1[i];
G[k].v+=G[q1[i]].v;
i++;
}
else {
G[k].f[0]=q2[j];
G[k].v+=G[q2[j]].v;
j++;
}
if ((G[q1[i]].v<G[q2[j]].v && i<=q1[0]) || j>q2[0])
{
G[k].f[1]=q1[i];
G[k].v+=G[q1[i]].v;
i++;
}
else {
G[k].f[1]=q2[j];
G[k].v+=G[q2[j]].v;
j++;
}
sol+=G[k].v;
q2[++q2[0]]=k;
}
df(k,0,0);
printf("%lld\n",sol);
for (i=1;i<=n;i++)
printf("%d %lld\n",lg[i],b[i]);
return 0;
}