Cod sursa(job #1165242)

Utilizator federerUAIC-Padurariu-Cristian federer Data 2 aprilie 2014 16:23:09
Problema Coduri Huffman Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<cstdio>
#include<queue>
#define Inf 1LL*1000000000*1000000000
#define Nmax 1000010
#define LL long long
using namespace std;
struct Arb{
	Arb *stg, *drp;
	int val;
	int crt;
	Arb()
	{
		stg = drp = NULL;
		val = 0;
		crt = 0;
	}
};
LL N, i, Nrcrt, sol[Nmax][2], lgT;
queue<LL>Q1;
queue<Arb*>Q2;
void solve()
{
	while (Q1.size() + Q2.size() > 1)
	{
		Arb *p = new Arb;
		for (i = 1; i <= 2; ++i)
		{
			LL comp1, comp2;
			if (Q1.empty())
				comp1 = Inf;
			else
				comp1 = Q1.front();
			if (Q2.empty())
				comp2 = Inf;
			else
				comp2 = Q2.front()->val;
			if (comp1 < comp2)
			{
				Arb *s = new Arb;
				Nrcrt++;
				s->crt = Nrcrt;
				p->val += Q1.front();
				Q1.pop();
				i == 1 ? p->stg = s : p->drp = s;
			}
			else
			{
				p->val += Q2.front()->val;
				i == 1 ? p->stg = Q2.front() : p->drp = Q2.front();
				Q2.pop();
			}
		}
		lgT += p->val;
		Q2.push(p);
	}
}
void DFS(Arb* R, LL nivel, LL cod)
{
	if (R->stg == NULL)
	{
		sol[R->crt][1] = cod;
		sol[R->crt][0] = nivel;
	}
	else
	{
		DFS(R->stg, nivel+1, cod*2);
		DFS(R->drp, nivel+1, (cod + 1)*2);
	}
}
int main()
{
	LL a;
	freopen("huffman.in", "r", stdin);
	freopen("huffman.out", "w", stdout);
	scanf("%lld", &N);
	for (i = 1; i <= N; ++i)
	{
		scanf("%lld", &a);
		Q1.push(a);
	}
	solve();
	Arb *R = new Arb;
	R = Q2.front();
	DFS(R, 0, 0);
	printf("%lld\n", lgT);
	for (i = 1; i <= N; ++i)
		printf("%lld %lld\n", sol[i][0], sol[i][1]);
	return 0;
}