Cod sursa(job #2687286)

Utilizator davidcotigacotiga david davidcotiga Data 19 decembrie 2020 18:07:18
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb

#include <bits/stdc++.h>

using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");

long long v[2000005];

queue<int> init, intern;

int n, nr;
long long s;

int mu[2000005][2];

long long rez[1000005];

int lung[1000005];

long long getmin() {
	int ret = 0;
	if (!init.empty() && (intern.empty() || v[init.front()] <= v[intern.front()])) {
		ret = init.front();
		init.pop();
		return ret;
	}
	ret = intern.front();
	intern.pop();
	return ret;
}

void dfs(int ind_nod, long long cod, int l) {
	if (ind_nod <= n) {
		rez[ind_nod] = cod;
		lung[ind_nod] = l;
		return;
	}
	dfs(mu[ind_nod][0], cod << 1, l + 1);
	dfs(mu[ind_nod][1], (cod << 1) | 1, l + 1);
}

int main()
{
	in >> n;
	for (int i = 1; i <= n; i++) {
		in >> v[i];
		init.push(i);
	}
	nr = n;
	while ((int)init.size() + (int)intern.size() > 1) {
		long long a, b;
		a = getmin();
		b = getmin();
		int c;
		nr++;
		c = nr;
		v[c] = v[a] + v[b];
		intern.push(c);
		mu[nr][0] = a;
		mu[nr][1] = b;
		s += v[c];
	}
	dfs(nr, 0, 0);
	out << s << "\n";
	for (int i = 1; i <= n; i++)
		out << lung[i] << " " << rez[i] << "\n";
	return 0;
}