Cod sursa(job #976773)

Utilizator tudorv96Tudor Varan tudorv96 Data 23 iulie 2013 22:26:02
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <queue>
#include <iostream>
using namespace std;

ifstream fin ("huffman.in");
ofstream fout ("huffman.out");

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() {
	fin >> n;
	for (int i = 1; i <= n; ++i) {
		fin >> 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);
	//for (int i = 1; i <= last; ++i)
		//cout << i << " " << v[i] << " " << fiu[i].first << " " << fiu[i].second << "\n";
	fout << sol << "\n";
	for (int i = 1; i <= n; ++i)
		fout << l[i] << " " << cod[i] << "\n";
}