Cod sursa(job #389069)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 31 ianuarie 2010 19:31:35
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>

#define file_in "huffman.in"
#define file_out "huffman.out"

#define Nmax 1010100

struct huffman
{
	long long f;
	int st,dr;
}
h[2*Nmax];
int n,m;
long long l,lg[Nmax],b[Nmax];
long long c[Nmax],v[Nmax];

void dfs(int nod, int Lg, long long niv)
{
	if (h[nod].f)
	{
		lg[nod]=Lg;
		b[nod]=niv;
		return ;
	}
	//if (h[nod].st) 
		dfs(h[nod].st,Lg+1,(niv<<1));
	//if (h[nod].dr) 
		dfs(h[nod].dr,Lg+1,(niv<<1)+1);
}

void solve()
{
	int i,j;
	i=1;
	j=1;
	m=0;
	
	while(i<=n || j<=m)
	{
		if (i<=n && (j>m || v[i]<c[j]))
		{
			i++;
			if (i>n && j>m)
				break;
			if (i<=n && (j>m || v[i]<c[j]))
			{
				c[++m]=v[i-1]+v[i];
				h[m+n].st=i-1;
				h[m+n].dr=i;
				h[m+n].f=0;
				i++;
				l+=c[m];
			}
			else
			{
				c[++m]=v[i-1]+c[j];
				h[m+n].st=i-1;
				h[m+n].dr=j+n;
				h[m+n].f=0;
				j++;
				l+=c[m];
			}
		}
		else
		{
			j++;
			if (i>n && j>m)
				break;
			if (j<=m && (i>n || v[i]>c[j]))
			{
				c[++m]=c[j-1]+c[j];
				h[m+n].st=j-1+n;
				h[m+n].dr=j+n;
				h[m+n].f=0;
				j++;
				l+=c[m];
			}
			else
			{
				c[++m]=c[j-1]+v[i];
				h[m+n].st=j-1+n;
				h[m+n].dr=i;
				h[m+n].f=0;
				i++;
				l+=c[m];
			}
		}
	}
}		



int main()
{
	int i;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d", &n);
	for (i=1;i<=n;++i)
	{
		scanf("%lld", &v[i]);
		h[i].f=v[i];
	}
	
	solve();
	dfs(n+m,0,0);
		
	printf("%lld\n", l);
	for (i=1;i<=n;++i)
		 printf("%lld %lld\n", lg[i], b[i]);
	
	
	fclose(stdin);
	fclose(stdout);
	
	
	return 0;
	
}