Cod sursa(job #470991)

Utilizator ooctavTuchila Octavian ooctav Data 16 iulie 2010 14:48:25
Problema Coduri Huffman Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

const int NMAX = 1000005;
const int INF = 1<<30;

struct nod
{
	int val;
	int fiu[2];
	nod()
	{
		val = 0;
		fiu[1] = 0;
		fiu[2] = 0;
	}
}Heap[2 * NMAX + 1];

int N;
int fol[2 * NMAX + 1];
int REZ;
int lg_sir[NMAX], baza_10[NMAX];
int q[2][2 * NMAX + 1];

void citi()
{
	cin >> N;
	for(int i = 1 ; i <= N ; i++)
	{
		cin >> Heap[i].val;
		q[0][i] = i;
	}
}

void construi()
{
	int cr = N;
	int inc[2] , sf[2];
	inc[0] = 1 ; inc[1] = 1;
	sf[0] = N ; sf[1] = 0;
	while(inc[0] + inc[1] <= sf[0] + sf[1])
	{
		++cr;
		for(int i = 0 ; i < 2 ; i++)
		{
			int minim = INF, poz;
			for(int j = 0 ; j < 2 ; j++)
				if(Heap[q[j][inc[j]]].val < minim && inc[j] <= sf[j])
				{
					minim = Heap[q[j][inc[j]]].val;
					poz = j;
				}
			Heap[cr].fiu[i] = q[poz][inc[poz]];
			Heap[cr].val += minim;
			inc[poz]++;
		}
		q[1][++sf[1]] = cr;
		REZ += Heap[cr].val;
	}
	
}

void dfs(int nod, int sir, int nivel)
{
	if(Heap[nod].fiu[0])
	{
		dfs(Heap[nod].fiu[0], 2 * sir, nivel + 1);
		dfs(Heap[nod].fiu[1], 2 * sir + 1, nivel + 1);
		return;
	}
	lg_sir[nod] = nivel;
	baza_10[nod] = sir;
}

void scrie()
{
	printf("%d\n", REZ);
	for(int i = 1 ; i <= N ; i++)
		printf("%d %d\n", lg_sir[i], baza_10[i]);
}

int main()
{
	freopen("huffman.in", "r", stdin);
	freopen("huffman.out", "w", stdout);
	citi();
	construi();
	dfs(2 * N - 1, 0, 0);
	scrie();
	return 0;
}