Pagini recente » Cod sursa (job #1675930) | Cod sursa (job #1687983) | Cod sursa (job #2083054) | Cod sursa (job #565469) | Cod sursa (job #2786355)
#include <cstdio>
#include <deque>
using namespace std;
const int NMAX = 1.e6;
struct node{
long long weight;
int left, right, pos;
node(long long _weight = 0, int _left = 0, int _right = 0, int _pos = 0): weight(_weight), left(_left), right(_right), pos(_pos){}
};
node tree[2 * NMAX + 5];
deque <node> dql, dqi;
long long v[NMAX + 5];
int lgc[NMAX + 5], n;
long long lg;
int get_node(){
if(dql.empty()){
node ti = dqi.front();
dqi.pop_front();
return ti.pos;
}
if(dqi.empty()){
node tl = dql.front();
dql.pop_front();
return tl.pos;
}
node tl = dql.front();
node ti = dqi.front();
if(tl.weight <= ti.weight){
dql.pop_front();
return tl.pos;
}
else{
dqi.pop_front();
return ti.pos;
}
}
void dfs(int nod, long long val, int lvl){
if(nod > n){
lg += tree[nod].weight;
dfs(tree[nod].left, val << 1, lvl + 1);
dfs(tree[nod].right, (val << 1)^1, lvl + 1);
}
else{
v[nod] = val;
lgc[nod] = lvl;
}
}
int main(){
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
int i, free;
long long w;
scanf("%d", &n);
for(i = 1; i <= n; i ++){
scanf("%lld", &w);
tree[i].weight = w;
tree[i].pos = i;
dql.push_back(tree[i]);
}
free = n;
while(dql.size() + dqi.size() >= 2){
++ free;
tree[free].left = get_node();
tree[free].right = get_node();
tree[free].pos = free;
tree[free].weight = tree[tree[free].left].weight + tree[tree[free].right].weight;
dqi.push_back(tree[free]);
}
dfs(free, 0, 0);
printf("%lld\n", lg);
for(i = 1; i <= n; i ++)
printf("%d %lld\n", lgc[i], v[i]);
return 0;
}