Cod sursa(job #3237881)

Utilizator tsg38Tsg Tsg tsg38 Data 13 iulie 2024 23:24:38
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#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;
}