Cod sursa(job #3297511)

Utilizator Arhiva_Educationala_2Arhiva Educationala doi Arhiva_Educationala_2 Data 22 mai 2025 18:54:43
Problema Coduri Huffman Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 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;
  std::queue<int> q2;

  while( (n - q1idx) + (int)q2.size() > 1 ){
    int a, b;
    if( q2.empty() || (!(q1idx == n) && v[q1idx] < v[q2.front()]) ){
      a = q1idx;
      q1idx++;
    }else{
      a = q2.front();
      q2.pop();
    }

    if( q2.empty() || (!(q1idx == n) && v[q1idx] < v[q2.front()]) ){
      b = q1idx;
      q1idx++;
    }else{
      b = q2.front();
      q2.pop();
    }

    v.push_back( v[a] + v[b] );
    left.push_back( a );
    right.push_back( b );
    q2.push( (int)v.size() - 1 );
  }

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