Cod sursa(job #1148006)

Utilizator vladrochianVlad Rochian vladrochian Data 20 martie 2014 12:45:41
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>
using namespace std;
int n,q1[1000001],q2[1000001],q1s=1,q1e,q2s=1,q2e,nr,l[1000001],fiu[2000001][2];
long long v[2000001],c[1000001],lt;
inline void qget(int &x)
{
	if(q1s>q1e)
		x=q2[q2s++];
	else if(q2s>q2e)
		x=q1[q1s++];
	else if(v[q1[q1s]]<v[q2[q2s]])
		x=q1[q1s++];
	else
		x=q2[q2s++];
}
void dfs(int nod,int lev,long long conf)
{
	if(fiu[nod][0])
	{
		dfs(fiu[nod][0],lev+1,conf<<1);
		dfs(fiu[nod][1],lev+1,(conf<<1)+1);
	}
	else
	{
		l[nod]=lev;
		c[nod]=conf;
		lt+=lev*v[nod];
	}
}
int main()
{
	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
	scanf("%d",&n);
	nr=n;
	while(q1e<n)
	{
		++q1e;
		q1[q1e]=q1e;
		scanf("%lld",v+q1e);
	}
	while(q1e-q1s+q2e-q2s>=0)
	{
		int a,b;
		qget(a);
		qget(b);
		q2[++q2e]=++nr;
		v[nr]=v[a]+v[b];
		fiu[nr][0]=a;
		fiu[nr][1]=b;
	}
	dfs(nr,0,0);
	printf("%lld\n",lt);
	for(int i=1;i<=n;++i)
		printf("%d %lld\n",l[i],c[i]);
	return 0;
}