Cod sursa(job #456747)

Utilizator nandoLicker Nandor nando Data 16 mai 2010 16:42:21
Problema Coduri Huffman Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
using namespace std;

#define NMAX 100100
typedef long long int64;

struct node{
	int64 val;
	int l,r;
}arb[NMAX<<1];

int64 code[NMAX<<1][2],size=0;
int n;

int dfs(int nod,int64 cod,int depth){
	if(arb[nod].l){
		return dfs(arb[nod].l,cod<<1,depth+1)+dfs(arb[nod].r,(cod<<1)+1,depth+1);
	}
	code[nod][0]=depth;
	code[nod][1]=cod;
	return arb[nod].val*depth;
}

int solve(){
	int p1=1,p2=n+1,len=n;
	
	while(p1 < n || p2 < len){
		arb[++len].val=0;
		
		if(p1<=n && (p2 >= len || arb[p1].val <= arb[p2].val)){
			arb[len].val += arb[p1].val;
			arb[len].l = p1,p1++;
		}else{
			arb[len].val += arb[p2].val;
			arb[len].l = p2,p2++;
		}
		
		if(p1<=n && (p2 >= len || arb[p1].val <= arb[p2].val)){
			arb[len].val += arb[p1].val;
			arb[len].r = p1,p1++;
		}else{
			arb[len].val += arb[p2].val;
			arb[len].r = p2,p2++;
		}
	}
	return len;
}

int main(){
	FILE* fin=fopen("huffman.in","r");
	FILE* fout=fopen("huffman.out","w");
	
	fscanf(fin,"%d ",&n);
	for(int i=1;i<=n;i++){
		fscanf(fin,"%lld ",&arb[i].val);
		arb[i].l=arb[i].r=0;
	}
		
	fprintf(fout,"%d\n",dfs(solve(),0,0));
			
	for(int i=1;i<=n;i++){
		fprintf(fout,"%lld %lld\n",code[i][0],code[i][1]);	
	}
	
	fclose(fin);
	fclose(fout);
}