Cod sursa(job #796736)

Utilizator radustn92Radu Stancu radustn92 Data 12 octombrie 2012 13:03:35
Problema Coduri Huffman Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#define NMAX 1000005
#define LMAX 2000005
#define ll long long
int n,A[NMAX],B[NMAX],r,p1,p2,poz[NMAX],C[LMAX],t;
int st[LMAX],dr[LMAX];
char L[LMAX];
ll val[LMAX],rez;
inline int check(int x,int y)
{
	if (x==n+1)
		return 0;
	if (y==r+1)
		return 1;
	return A[x]<C[B[y]];
}
int main()
{
	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
	scanf("%d",&n);
	int i,nod1,nod2;
	for (i=1; i<=n; i++)
		scanf("%d",&A[i]);
	while (p1<n || p2<r)
	{
		if (check(p1+1,p2+1))
			C[++t]=A[++p1],poz[p1]=t,nod1=t;
		else
			nod1=B[++p2];
		
		if (check(p1+1,p2+1))
			C[++t]=A[++p1],poz[p1]=t,nod2=t;
		else
			nod2=B[++p2];
			
		C[++t]=C[nod1]+C[nod2];
		st[t]=nod1; dr[t]=nod2;
		B[++r]=t;
		
		if (p1==n && r-p2==1)
			break ;
	}
	
	for (i=t; i>=1; i--)
		if (st[i] && dr[i])
		{
			L[st[i]]=L[dr[i]]=L[i]+1; 
			val[st[i]]=val[i]*2;
			val[dr[i]]=val[i]*2+1;
			
			rez+=C[i];
		}
		
	printf("%lld\n",rez);
	for (i=1; i<=n; i++)
		printf("%d %lld\n",L[poz[i]],val[poz[i]]);
	return 0;
}