Cod sursa(job #473871)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 1 august 2010 12:57:10
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdio.h>
#define Nmax 1000002
#define INF 1000000000000000000LL
#define LL long long

struct Arbore{
	int st,dr;
} Arb[2*Nmax];

LL V1[Nmax],V2[Nmax];
LL sum,Lg[Nmax],Cat[Nmax];
int n,m;

void dfs(int cine, LL cat, LL lg){
	if( cine < 0 ){
		Lg[-cine]=lg, Cat[-cine]=cat; 
	} 
	else{
		dfs(Arb[cine].st,cat*2,lg+1);
		dfs(Arb[cine].dr,cat*2+1,lg+1);
	}
}

void scrie(){
	int i;
	printf("%lld\n",sum);
	dfs(m,0,0);
	
	for(i=1;i<=n;++i) printf("%lld ",Lg[i]),printf("%lld\n",Cat[i]);
	fclose(stdin); fclose(stdout);
}	

int main(){
	int i,j,c1,c2; LL min1,min2;
	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;++i) scanf("%lld",&V1[i]);
	
	i=1; j=1; m=0; V2[1]=INF; V1[n+1]=INF;
	while( i<=n || j<m ){
		if( V1[i] < V2[j] ) c1=-i,min1=V1[i++];
		else c1=j,min1=V2[j++];

		if( V1[i] < V2[j] ) c2=-i,min2=V1[i++];
		else c2=j,min2=V2[j++];
		
		V2[++m]=min1+min2; V2[m+1]=INF;
		Arb[m].st=c2; Arb[m].dr=c1;
		
		sum += V2[m];
	}
	
	scrie();
	return 0;
}