Cod sursa(job #623953)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 21 octombrie 2011 09:14:34
Problema Coduri Huffman Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<fstream>
#define Nmax 1000010
#define inf 0x7FFFFFFFFFFFFFFFLL
using namespace std;

int N,u,p,q,s[2*Nmax],d[2*Nmax],l[2*Nmax];
long long nr,c[2*Nmax],v[2*Nmax];


int main(){
	
	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
	
	scanf("%d",&N);
	for(int i=1;i<=N;++i)
		scanf("%lld",&v[i]);
	
	q=N+1;
	p=1;
	u=N;
	
	while(p<=N){
		
		long long mn1,mn2,mn3;
		
		mn1=mn2=mn3=inf;
		
		if(p<N)
			mn1=v[p]+v[p+1];
		
		if(p<=N && q>N && q<=u)
			mn2=v[p]+v[q];
		
		if(q<u)
			mn3=v[q]+v[q+1];
		
		if(mn1 <= mn2 && mn1 <= mn3){
			v[++u]=mn1;
			s[u]=p;
			d[u]=p+1;
			p+=2;
			nr+=mn1;
		}
		
		else 
			if(mn2<=mn1 && mn2 <=mn3 ){
					v[++u]=mn2;
					s[u]=p;
					d[u]=q;
					++p;
					++q;
					nr+=mn2;
			}
			
		else {
			v[++u]=mn3;
			s[u]=q;
			d[u]=q+1;
			q+=2;
			nr+=mn3;
		}
				
		
	}
	
	while(q<u){
		v[++u]=v[q]+v[q+1];
		s[u]=q;
		d[u]=q+1;
		q+=2;
		nr+=v[u];
	}
	
	for(int t=u;t>N;--t){
			l[s[t]]=l[d[t]]=l[t]+1;
			c[s[t]]=c[d[t]]=c[t]<<1;
			++c[d[t]];
		
	}
	
	printf("%lld\n",nr);
	
	for(int i=1;i<=N;++i)
		printf("%d %lld\n",l[i],c[i]);
	
return 0;
}