Pagini recente » Cod sursa (job #606915) | Cod sursa (job #1520102) | Cod sursa (job #2625362) | Cod sursa (job #1219743) | Cod sursa (job #2614047)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
typedef long long lint;
struct Node{
int ch[2];
lint val;
};
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n;
Node nodes[2000041];
queue<int> inter;
void read(){
fin >> n;
for(int i = 1; i <= n; ++i){
int a;fin >> nodes[i].val;
}
}
lint ans1 = 0;
void solve(){
int init = 1;
for(int i = n+1; i <= 2*n-1; ++i){
Node &node = nodes[i];
for(int j = 0; j < 2; ++j){
int ch;
if(inter.empty() || (init <= n && nodes[init].val < nodes[inter.front()].val)){
ch = init;
init++;
}else{
ch = inter.front();
inter.pop();
}
node.ch[j] = ch;
node.val += nodes[ch].val;
}
ans1 += node.val;
inter.push(i);
}
}
typedef pair<int,lint> Ans2;
Ans2 ans2[1000041];
void dfs(int a=2*n-1, int len=0, lint code=0){
Node &node = nodes[a];
for(int i = 0; i < 2; ++i){
int b = node.ch[i];
int nlen = len+1;
lint ncode = (code<<1) + i;
if(b > n){
dfs(b, nlen, ncode);
}else{
ans2[b] = {nlen, ncode};
}
}
}
void write(){
fout << ans1 << "\n";
dfs();
for(int i = 1; i <= n; ++i){
fout << ans2[i].first << " " << ans2[i].second << "\n";
}
}
int main(){
// ios_base::sync_with_stdio(false);
read();
solve();
write();
return 0;
}