Cod sursa(job #3233656)

Utilizator betybety bety bety Data 4 iunie 2024 12:05:29
Problema Coduri Huffman Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
using ll = long long;
using pii = pair<ll, int>;
const int lim = 1e6+5;
int lefty[2*lim];
int righty[2*lim];
ll freq[2*lim];
int ans[2*lim];
int deep[2*lim];
int n, cnt;
set<pii> s;
void df(int nod) {
	if(nod <= n) {
		return ;
	}
	deep[lefty[nod]] = deep[nod] + 1;
	deep[righty[nod]] = deep[nod] + 1;
	ans[lefty[nod]] = ans[nod];
	ans[righty[nod]] = ans[nod];
	ans[righty[nod]] |= (1<<deep[nod]);
	df(lefty[nod]);
	df(righty[nod]);
}
int main() {
	in>>n;
	for(int i=1;i<=n;++i) {
		in>>freq[i];
		s.insert(make_pair(freq[i], i));
	}
	cnt = n;
	while(s.size() > 1) {
		auto p1 = *s.begin();
		s.erase(s.begin());
		auto p2 = *s.begin();
		s.erase(s.begin());
		
		++cnt;
		freq[cnt] = p1.first + p2.first;
		lefty[cnt] = p1.second;
		righty[cnt] = p2.second;
		
		s.insert(make_pair(freq[cnt], cnt));
	}
	ll sum = 0;
	df(cnt);
	for(int i=1;i<=n;++i) {
		sum += freq[i]*deep[i];
	}
	out<<sum<<'\n';
	for(int i=1;i<=n;++i) {
		out<<deep[i]<<' '<<ans[i]<<'\n';
	}
	return 0;
}