Cod sursa(job #3297519)

Utilizator Arhiva_Educationala_2Arhiva Educationala doi Arhiva_Educationala_2 Data 22 mai 2025 19:05:08
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#pragma GCC optimize("Os")

#include <stdio.h>
#include <vector>
#include <queue>

constexpr int NIL = -1;
using ll = long long;

int main() {
  FILE *fin = fopen( "huffman.in", "r" );
  FILE *fout = fopen( "huffman.out", "w" );

  int n;
  fscanf( fin, "%d", &n );
  std::vector<ll> v(n);
  std::vector<bool> side(n, false);
  std::vector<int> par(n, NIL);

  v.reserve( 2 * n );
  par.reserve( 2 * n );
  side.reserve( 2 * n );

  for( int i = 0; i < n; i++ )
    fscanf( fin, "%lld", &v[i] );

  int q1idx = 0;
  int q2begin = n, q2end = n;

  while( (n - q1idx) + (q2end - q2begin) > 1 ){
    int a, b;
    if( (q2end == q2begin) || (!(q1idx == n) && v[q1idx] < v[q2begin]) )
      a = q1idx++;
    else
      a = q2begin++;

    if( (q2end == q2begin) || (!(q1idx == n) && v[q1idx] < v[q2begin]) )
      b = q1idx++;
    else
      b = q2begin++;

    v.push_back( v[a] + v[b] );
    par.emplace_back();
    side.emplace_back();

    par[a] = q2end;
    side[a] = false;
    par[b] = q2end;
    side[b] = true;
    q2end++;
  }

  std::vector<int> len(v.size());
  std::vector<ll> val(v.size());
  len.back() = 0;
  val.back() = 0;
  for( int i = (int)v.size() - 1; i--; ){
    len[i] = 1 + len[par[i]];
    val[i] = 2 * val[par[i]] + side[i];
  }

  ll ans = 0;
  for( int i = 0; i < n; i++ )
    ans += len[i] * (ll)v[i];

  fprintf( fout, "%lld\n", ans );
  for( int i = 0; i < n; i++ )
    fprintf( fout, "%d %lld\n", len[i], val[i] );

  fclose( fin );
  fclose( fout );
  return 0;
}