Pagini recente » Cod sursa (job #3253376) | Cod sursa (job #1215547) | Cod sursa (job #2948044) | Cod sursa (job #1071656) | Cod sursa (job #3237881)
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ifstream fin( "huffman.in" );
ofstream fout( "huffman.out" );
const int DIM = 2e6 + 1;
queue<int> q[2];
int l[DIM], r[DIM], idx;
ll fr[DIM];
int get_next() {
if ( q[0].size() == 0 ) {
int i = q[1].front();
q[1].pop();
return i;
}
if ( q[1].size() == 0 ) {
int i = q[0].front();
q[0].pop();
return i;
}
int z = (fr[q[0].front()] <= fr[q[1].front()] ? 0 : 1);
int i = q[z].front();
q[z].pop();
return i;
}
void add_node() {
int i = get_next(), j = get_next();
q[1].push(++idx);
fr[idx] = fr[i] + fr[j];
l[idx] = i, r[idx] = j;
}
pair<int, ll> sol[DIM];
ll dfs( int u, ll code = 0, int dep = 0 ) {
if ( u == 0 ) return 0;
if ( !l[u] && !r[u] ) {
sol[u] = {dep, code};
return 0;
}
ll x = dfs(l[u], code * 2, dep + 1);
ll y = dfs(r[u], code * 2 + 1, dep + 1);
return x + y + fr[u];
}
int main() {
ios_base::sync_with_stdio(0);
fin.tie(0);
int n;
fin >> n;
for ( int i = 1; i <= n; ++i ) {
fin >> fr[i];
q[0].push(i);
}
idx = n;
while ( q[0].size() + q[1].size() > 1 ) {
add_node();
}
fout << dfs(get_next()) << "\n";
for ( int i = 1; i <= n; ++i ) {
fout << sol[i].first << " " << sol[i].second << "\n";
}
fin.close();
fout.close();
return 0;
}