Cod sursa(job #388195)

Utilizator ConsstantinTabacu Raul Consstantin Data 29 ianuarie 2010 16:14:33
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<stdio.h>
struct huffman{long long v;
				int s,d;}h[ 2000010 ];
				
long long n,m,i,j,L,v[ 1000010 ],q[ 1000010 ],c[ 1000010 ];
int lg[ 1000010 ];

void solve(){
long long i,j;

for(i =1,j = 1; i <= n || j < m;)
	if(i <= n &&(j > m || v[i] < q[j])){
		i++;if(i > n && j > m)break;
		
		if(i <= n &&(j > m || v[i] < q[j]))
			{m++;
			q[m] = v[i-1];
			q[m] += v[i];
			h[n+m].s = i-1;
			h[n+m].d = i;
			i++;
			}
		else
			{m++;
		q[m] = v[i-1];
			q[m] += q[j];
			h[n+m].s = i-1;
			h[n+m].d = n+j;
			j++;}
		L += q[m];
	}
	else
	{j++;
	if(i > n && j > m )break;
	if(j <= m &&(i > n || q[j] < v[i]))
		{m++;
		q[m] = q[j-1];
		q[m] += q[j];
		h[n+m].s = n+j-1;
		h[n+m].d = n+j;
		j++;}
	else
		{m++;
		q[m] = q[j-1];
		q[m] += v[i];
		h[n+m].s = n+j-1;
		h[n+m].d = i;
		i++;}
	L += q[ m ];
	}
		

}

void dfs(int nod,int lung,long long cod){
if(h[nod].v){lg[nod] = lung;c[nod] = cod;return;}
if(h[nod].s)
dfs(h[nod].s,lung+1,cod<<1);
if(h[nod].d)
dfs(h[nod].d,lung+1,(cod<<1)+1);
}
int main(){
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);

scanf("%lld",&n);
for(i = 1; i <= n; i++){
	scanf("%lld",&v[i]);
	h[i].v = v[i];
	}

solve();
dfs(n+m,0,0);

printf("%lld\n",L);
for(i = 1; i <= n; i++)
	printf("%lld %lld\n",lg[i],c[i]);

return 0;}