Cod sursa(job #3297515)

Utilizator Arhiva_Educationala_2Arhiva Educationala doi Arhiva_Educationala_2 Data 22 mai 2025 18:58:01
Problema Coduri Huffman Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 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<int> left(n, NIL), right(n, NIL);

  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] );
    left.push_back( a );
    right.push_back( b );
    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(); i--; ){
    if( i < n ) continue;
    len[left[i]] = 1 + len[i];
    val[left[i]] = 2 * val[i];
    len[right[i]] = 1 + len[i];
    val[right[i]] = 2 * val[i] + 1;
  }

  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;
}