Cod sursa(job #523933)

Utilizator swift90Ionut Bogdanescu swift90 Data 19 ianuarie 2011 20:32:45
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
#define NMAX 1000100
#define INF 1LL * 1000000000 * 2000000000
int N,lg[NMAX],cc[NMAX],fs[2*NMAX],fd[2*NMAX],NC;
long long val[2*NMAX],cod[NMAX],S;
void df(int pp,int h,long long cd){
	if(pp<=N){
		lg[pp]=h;
		cod[pp]=cd;
		return;
	}
	df(fs[pp],h+1,cd<<1);
	df(fd[pp],h+1,(cd<<1)+1);
}
int main(){
	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
	int i,p,u,a,b,c;
	scanf("%d",&N);
	for(i=1;i<=N;++i)
		scanf("%lld",&val[i]);
	for(;i<=(N<<1)+2;++i)
		val[i]=INF;
	val[0]=INF;
	i=N+1;
	c=1;
	u=0;
	p=1;
	while(1){
		if(val[c]<val[cc[p]]){
			a=c++;
			if(val[c]<val[cc[p]])
				b=c++;
			else
				b=cc[p++];
		}
		else{
			a=cc[p++];
			if(val[c]<val[cc[p]])
				b=c++;
			else
				b=cc[p++];
		}
		if(val[a]==INF || val[b]==INF)
			break;
		val[++i]=val[a]+val[b];
		S+=val[i];
		fs[i]=a;
		fd[i]=b;
		cc[++u]=i;
	}
	
	df(i,0,0);
	printf("%lld\n",S);
	for(i=1;i<=N;++i)
		printf("%d %lld\n",lg[i],cod[i]);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}