Cod sursa(job #474103)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 2 august 2010 15:42:58
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#include <cstring>

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

#define nmax 1010001

int n;
int lung[nmax];
long long ap[nmax];
long long len;
struct huffman
{
	int val,fs,fd;
}
nod[2*nmax];

void citire()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d", &n);
	for (int i=1;i<=n;++i)
	{
		scanf("%d", &nod[i].val);
	}
}

void dfs(int q, int x, long long val)
{
	if (nod[q].fs)
	{
		dfs(nod[q].fs,x+1,2*val);
		dfs(nod[q].fd,x+1,2*val+1);
		return ;
	}
	lung[q]=x;
	ap[q]=val;
	len+=x*nod[q].val;
}

void solve()
{
	int q1=1,q;
	int q2=n+1;
	int i=n;
	long long x;
	
	while(q1<n || q2<i)
	{
		++i;
		nod[i].val=0;
		if (q1<=n && (q2>=i || nod[q1].val<=nod[q2].val))
		{
			x=nod[q1].val;
			q=q1;
			q1++;
		}
		else
		{
			x=nod[q2].val;
			q=q2;
			q2++;
		}
        nod[i].val+=x;
		nod[i].fs=q;
		
		if (q1<=n && (q2>=i || nod[q1].val<=nod[q2].val))
		{
			x=nod[q1].val;
			q=q1;
			q1++;
		}
		else
		{
			x=nod[q2].val;
			q=q2;
			q2++;
		}
		
		nod[i].val+=x;
		nod[i].fd=q;
	}
	dfs(i,0,0);
	
	printf("%lld\n", len);
	for (i=1;i<=n;++i)
		 printf("%d %lld\n", lung[i], ap[i]);
}


int main(){
	
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}