Cod sursa(job #372389)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 9 decembrie 2009 20:46:38
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include<stdio.h>
#define N 2000011
int n,i,j,k,p1,p2,u1,u2,t[N],c[N],lg;
long long sol,v[N],h;
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];c[2]=1;t[1]=t[2]=n+1;
	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];
				c[p1+1]=1;
				t[p1]=t[p1+1]=u2;
				p1+=2;
			}
		    else
			if(v[p2+1]<=v[p1])
			{
				u2++;
				v[u2]=v[p2]+v[p2+1];sol+=v[u2];
				c[p2+1]=1;t[p2]=t[p2+1]=u2;
				p2+=2;
			}
			else
			{
				u2++;
				v[u2]=v[p1]+v[p2];sol+=v[u2];
				c[p2]=1;
				t[p1]=t[p2]=u2;
				p1++;p2++;
			}
			continue;
		}
		if(p2==u2)
		{
			if(v[p1+1]<=v[p2])
			{
				u2++;
				v[u2]=v[p1]+v[p1+1];sol+=v[u2];
				c[p1+1]=1;
				t[p1]=t[p1+1]=u2;
				p1+=2;
			}
		    else
			{
				u2++;
				v[u2]=v[p1]+v[p2];sol+=v[u2];
				c[p2]=1;
				t[p1]=t[p2]=u2;
				p1++;p2++;
			}
			continue;
		}
		u2++;
		v[u2]=v[p1]+v[p1+1];sol+=v[u2];
		c[p1+1]=1;
		t[p1]=t[p1+1]=u2;
		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];
				c[p2+1]=1;t[p2]=t[p2+1]=u2;
				p2+=2;
			}
			else
			{
				u2++;
				v[u2]=v[p1]+v[p2];sol+=v[u2];
				c[p2]=1;
				t[p1]=t[p2]=u2;
				p1++;p2++;
			}
			continue;
		}
		u2++;
		v[u2]=v[p1]+v[p2];sol+=v[u2];
		c[p2]=1;
		t[p1]=t[p2]=u2;
		p1++;p2++;
	}
	while(p2<u2)
	{
		u2++;
		v[u2]=v[p2]+v[p2+1];sol+=v[u2];
		c[p2+1]=1;
		t[p2]=t[p2+1]=u2;
		p2+=2;
	}
	printf("%lld\n",sol);k=2*n-1;
	for(i=1;i<=n;i++)
	{
		lg=0;h=0;
		for(j=i;j<k;j=t[j])
		{
			lg++;h*=2;h+=c[j];
		}
		printf("%d %lld\n",lg,h);
	}
}