Cod sursa(job #430151)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 30 martie 2010 19:56:03
Problema Coduri Huffman Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>
#define Nmax 1000010

struct Arb { int cost,st,dr;} A[Nmax<<1];

int n,i,nod1,nod2,Q1[Nmax],Q2[Nmax],R,p,u,L[Nmax];
long long Sum, Cod[Nmax];

void add()
{
	R++;
	A[R].cost = A[nod1].cost + A[nod2].cost;
	A[R].st=nod1;
	A[R].dr=nod2;
	Sum+=A[R].cost;
}

void dfs (int nod, long long cod, int mSize)
{
	if(A[nod].st==0)
	{
		L[nod]=mSize;
		Cod[nod]=cod;
		return;
	}
	
	dfs(A[nod].st,cod<<1,mSize+1);
	dfs(A[nod].dr,(cod<<1)+1,mSize+1);
}

int main()
{
	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
	
	scanf("%d",&n);
	
	for(i=1;i<=n;i++)
	{
		scanf("%d",&A[i].cost);
		Q1[i]=i;
	}
	
	if(n==1) {printf("0\n1 0"); return 0;}
	
	R=n;
	nod1=1; nod2=2;
	add();
	
	i=3; Q2[1]=R; p=u=1;
	
	while(i<=n)
	{
		nod1=Q1[i];
		nod2=Q2[p];
		
		if(i+1<=n && A[Q1[i+1]].cost < A[nod2].cost)
		{
			nod2=Q1[i+1];
			i+=2;
		}
		else if(p+1<=u && A[Q2[p+1]].cost < A[nod1].cost)
		{
			nod1=Q2[p+1];
			p+=2;
		}
		else i++,p++;			
		
		add();		
		Q2[++u]=R;		
	}
	
	while(p!=u)
	{
		nod1=Q2[p];
		nod2=Q2[p+1];
		p+=2;
		
		add();
		Q2[++u]=R;
	}
	
	dfs(R,0,0);
	
	printf("%lld\n",Sum);
	
	for(i=1;i<=n;i++)
		printf("%d %lld\n",L[i],Cod[i]);
	return 0;
}