Cod sursa(job #590384)

Utilizator drywaterLazar Vlad drywater Data 17 mai 2011 09:16:02
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#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;
}