Cod sursa(job #754269)

Utilizator darrenRares Buhai darren Data 1 iunie 2012 11:59:32
Problema Coduri Huffman Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int SIZE = 1000002;

int N, F[SIZE];
int Q[2][SIZE], beg[2], end[2];
int nodnow;
long long val[2 * SIZE];
int son[2 * SIZE][2], leng[SIZE];
long long bin[SIZE], result;

void Dfs(int nod, long long val, int len)
{
	if (son[nod][0])
	{
		Dfs(son[nod][0], val * 2, len + 1);
		Dfs(son[nod][1], val * 2 + 1, len + 1);
		return;
	}
	leng[nod] = len;
	bin[nod] = val;
}

int main()
{
	freopen("huffman.in", "r", stdin);
	freopen("huffman.out", "w", stdout);
	
	scanf("%d", &N);
	
	beg[0] = 1, end[0] = 0;
	for (int i = 1; i <= N; ++i)
	{
		scanf("%d", &F[i]);
		Q[0][++end[0]] = i;
		val[i] = F[i];
	}
	
	nodnow = N;
	
	beg[1] = 1, end[1] = 0;
	
	int now, where;
	while (end[0] + end[1] - beg[0] - beg[1] >= 0)
	{
		++nodnow;
		
		{
			now = -1;
			for (int j = 0; j < 2; ++j)
				if (beg[j] <= end[j] && (now == -1 || val[now] > val[Q[j][beg[j]]]))
				{
					now = Q[j][beg[j]];
					where = j;
				}
			++beg[where];
			
			val[nodnow] += val[now];
			son[nodnow][0] = now;
		}
		{
			now = -1;
			for (int j = 0; j < 2; ++j)
				if (beg[j] <= end[j] && (now == -1 || val[now] > val[Q[j][beg[j]]]))
				{
					now = Q[j][beg[j]];
					where = j;
				}
			++beg[where];
			
			val[nodnow] += val[now];
			son[nodnow][1] = now;
		}
		
		Q[1][++end[1]] = nodnow;
	}
	Dfs(nodnow, 0, 0);
	
	for (int i = 1; i <= N; ++i)
		result += 1LL * F[i] * leng[i];
	printf("%lld\n", result);
	for (int i = 1; i <= N; ++i)
		printf("%d %lld\n", leng[i], bin[i]);
}