Pagini recente » Cod sursa (job #2783258) | Cod sursa (job #995763) | Cod sursa (job #2849897) | Cod sursa (job #2016391) | Cod sursa (job #3233656)
#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;
}