Cod sursa(job #976781)

Utilizator tudorv96Tudor Varan tudorv96 Data 23 iulie 2013 22:36:36
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <queue>
#include <cstdio>
using namespace std;

const int N = (int)(1e6+5);
long long v[N*2], sol, cod[N], l[N];
pair <int, int> fiu[N*2];
queue <int> Q1, Q2;
int last, n;

void dfs(int x, long long lv, long long code) {
	if (x > n) {
		sol += v[x];
		dfs(fiu[x].first, lv + 1, code * 2);
		dfs(fiu[x].second, lv + 1, code * 2 + 1);
	}
	else {
		l[x] = lv;
		cod[x] = code;
	}
}

int get_min() {
	int MIN;
	if (!Q2.size()) {
		MIN = Q1.front(); Q1.pop();
		return MIN;
	}
	if (!Q1.size()) {
		MIN = Q2.front(); Q2.pop();
		return MIN;
	}
	if (v[Q1.front()] <= v[Q2.front()]) {
		MIN = Q1.front(); Q1.pop();
		return MIN;
	}
	MIN = Q2.front(); Q2.pop();
	return MIN;
}

int main() {
	freopen ("huffman.in", "r", stdin);
	freopen ("huffman.out", "w", stdout);
	scanf ("%d", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &v[i]);
		Q1.push(i);
	}
	last = n;
	while (Q1.size() + Q2.size() > 1) {
		int MIN1 = get_min();
		int MIN2 = get_min();
		v[++last] = v[MIN1] + v[MIN2];
		fiu[last].first = MIN1;
		fiu[last].second = MIN2;
		Q2.push(last);
	}
	dfs(last, 0, 0);
	printf("%lld\n", sol);
	for (int i = 1; i <= n; ++i)
		printf ("%lld %lld\n" , l[i], cod[i]);
}