Cod sursa(job #372397)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 9 decembrie 2009 21:03:24
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<stdio.h>
#define N 2000011
int n,i,j,k,p1,p2,u1,u2,f1[N],f2[N],c[N],lg[N];
long long sol,v[N],h[N];
void read(),solve();
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%lld",&v[i]);
}
void solve()
{
	sol=v[n+1]=v[1]+v[2];
	f1[n+1]=1;f2[n+1]=2;
	p1=3;u1=n;p2=u2=n+1;
	while(p1<u1)
	{
		if(p2<u2)
		{
			if(v[p1+1]<=v[p2])
			{
				u2++;
				v[u2]=v[p1]+v[p1+1];sol+=v[u2];
				f1[u2]=p1;f2[u2]=p1+1;
				p1+=2;
			}
		    else
			if(v[p2+1]<=v[p1])
			{
				u2++;
				v[u2]=v[p2]+v[p2+1];sol+=v[u2];
				f1[u2]=p2;f2[u2]=p2+1;
				p2+=2;
			}
			else
			{
				u2++;
				v[u2]=v[p1]+v[p2];sol+=v[u2];
				f1[u2]=p1;f2[u2]=p2;
				p1++;p2++;
			}
			continue;
		}
		if(p2==u2)
		{
			if(v[p1+1]<=v[p2])
			{
				u2++;
				v[u2]=v[p1]+v[p1+1];sol+=v[u2];
				f1[u2]=p1;f2[u2]=p1+1;
				p1+=2;
			}
		    else
			{
				u2++;
				v[u2]=v[p1]+v[p2];sol+=v[u2];
				f1[u2]=p1;f2[u2]=p2;
				p1++;p2++;
			}
			continue;
		}
		u2++;
		v[u2]=v[p1]+v[p1+1];sol+=v[u2];
		f1[u2]=p1;f2[u2]=p1+1;
		p1+=2;
	}
	while(p1==u1&&p2<=u2)
	{
		if(p2<u2)
		{
			if(v[p2+1]<=v[p1])
			{
				u2++;
				v[u2]=v[p2]+v[p2+1];sol+=v[u2];
				f1[u2]=p2;f2[u2]=p2+1;
				p2+=2;
			}
			else
			{
				u2++;
				v[u2]=v[p1]+v[p2];sol+=v[u2];
				f1[u2]=p1;f2[u2]=p2;
				p1++;p2++;
			}
			continue;
		}
		u2++;
		v[u2]=v[p1]+v[p2];sol+=v[u2];
		f1[u2]=p1;f2[u2]=p2;
		p1++;p2++;
	}
	while(p2<u2)
	{
		u2++;
		v[u2]=v[p2]+v[p2+1];sol+=v[u2];
		f1[u2]=p2;f2[u2]=p2+1;
		p2+=2;
	}
	printf("%lld\n",sol);k=2*n-1;
	for(i=k;i>n;i--)
	{
		lg[f1[i]]=lg[f2[i]]=lg[i]+1;
		h[f1[i]]=2*h[i];
		h[f2[i]]=2*h[i]+1;
	}
	for(i=1;i<=n;i++)printf("%d %lld\n",lg[i],h[i]);
}