Cod sursa(job #623952)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 21 octombrie 2011 09:12:13
Problema Coduri Huffman Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 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];

ifstream f("huffman.in");
ofstream g("huffman.out");

int main(){
	
	f>>N;;
	for(int i=1;i<=N;++i)
		f>>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]];
		
	}
	
	g<<nr<<'\n';
	
	for(int i=1;i<=N;++i)
		g<<l[i]<<' '<<c[i]<<'\n';
	
return 0;
}