Pagini recente » Rating Kleinknecht Dorin (bazg) | Cod sursa (job #2237427) | Cod sursa (job #1776507) | Cod sursa (job #2380477) | Cod sursa (job #3233659)
#include <bits/stdc++.h>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
using ll = long long;
using pii = pair<ll, ll>;
const ll lim = 1e6+5;
ll lefty[2*lim];
ll righty[2*lim];
ll freq[2*lim];
ll ans[2*lim];
ll deep[2*lim];
ll n, cnt;
set<pii> s;
void df(ll 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]] |= (1LL<<deep[nod]);
df(lefty[nod]);
df(righty[nod]);
}
int main() {
in>>n;
for(ll 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(ll i=1;i<=n;++i) {
sum += freq[i]*deep[i];
}
out<<sum<<'\n';
for(ll i=1;i<=n;++i) {
out<<deep[i]<<' '<<ans[i]<<'\n';
}
return 0;
}