Cod sursa(job #1434566)

Utilizator ArkinyStoica Alex Arkiny Data 10 mai 2015 20:00:45
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
using namespace std;

#define nmax 1000001
int d[2][nmax],st[2],f[2];
long long rez=0;
long long c[nmax],nv[nmax];

struct nod
{
	long long v;
	long l,r;
};

nod h[nmax*2];
int n;
FILE *in,*out;

void bf(int poz,long long put,int nivel)
{
	if(h[poz].l)
	{
		bf(h[poz].l,put*2,nivel+1);
		bf(h[poz].r,put*2+1,nivel+1);
		return;
	}
	c[poz]=put;
	nv[poz]=nivel;
}

void rezolva()
{
	int k=n;

	st[0]=1;st[1]=1;
	f[0]=n;f[1]=0;
	int c[2];
	int j;
	while(f[0]-st[0]>=0 || f[1]-st[1]>0)
	{
		int p=0;
		++k;
		for(j=0;j<2;j++)
		{
			if(!(f[0]-st[0]>=0))
				p=1;
			else if(!(f[1]-st[1]>=0))
				p=0;
			else 
				p=(d[0][st[0]]<d[1][st[1]]) ? 0 : 1;


			c[j]=st[p]+ n*p;
            st[p]++;
		}
		h[k].l=c[0];
		h[k].r=c[1];
		h[k].v=h[c[0]].v + h[c[1]].v;
		rez+=h[k].v;

		d[1][++f[1]]=h[k].v;
	}
	bf(k,0,0);
}

int main()
{
	in=fopen("huffman.in","r");
	out=fopen("huffman.out","w");

    fscanf(in,"%lld",&n);
	
	for(int i=1;i<=n;i++)
	{
		 fscanf(in,"%d",&h[i].v);
		d[0][i]=h[i].v;
	}
	rezolva();
	fprintf(out,"%lld \n",rez);
	for(int i=1;i<=n;i++)
		fprintf(out,"%lld %lld \n",nv[i],c[i]);
	return 0;
}