Mai intai trebuie sa te autentifici.

Cod sursa(job #374404)

Utilizator AndreyPAndrei Poenaru AndreyP Data 16 decembrie 2009 22:58:26
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<stdio.h>
#include<stdlib.h>
#define N 1000010
const long long inf=1LL<<62;
struct Nod
{
	long long v;
	int f[2];
};
Nod nod[N<<1];
int n;
int p[2];
int u[2];
int q[2][N];
long long lsol;
int lb[N];
long long b[N];
inline void citire()
{
	scanf("%d",&n);
	for(int i=1; i<=n; ++i)
	{
		scanf("%lld",&nod[i].v);
		q[0][i]=i;
	}
}
void dfs(int poz,long long cod,int niv)
{
	if(nod[poz].f[0]!=0)
	{
		dfs(nod[poz].f[0],cod<<1,niv+1);
		dfs(nod[poz].f[1],(cod<<1)+1,niv+1);
		return;
	}
	lb[poz]=niv;
	b[poz]=cod;
}
inline void rezolva()
{
	p[0]=p[1]=1;
	u[0]=n;
	u[1]=0;
	long long val;
	int cc;
	int k=n;
	while(p[0]<=u[0] || p[1]<u[1])
	{
		++k;
		for(int i=0; i<2; ++i)
		{
			val=inf;
			//cc=-1;
                        for(int j=0; j<2; ++j)
			{
				if(p[j]<=u[j] && nod[q[j][p[j]]].v<val)
				{
					val=nod[q[j][p[j]]].v;
					cc=j;
				}
			}
			if(cc==-1)
				exit(4);
			nod[k].v+=val;
			nod[k].f[i]=q[cc][p[cc]];
			++p[cc];
		}
		lsol+=nod[k].v;
		q[1][++u[1]]=k;
	}
	dfs(k,0,0);
}
inline void scrie()
{
	printf("%lld\n",lsol);
	for(int i=1; i<=n; ++i)
		printf("%d %lld\n",lb[i],b[i]);
}
int main()
{
	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
        citire();
        rezolva();
        scrie();
	return 0;
}