Cod sursa(job #2103667)

Utilizator GoogalAbabei Daniel Googal Data 10 ianuarie 2018 17:18:51
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("huffman.in");
ofstream out("huffman.out");

const long long NMAX = 1000000;
const long long INF = 1LL * 1e18;

struct Tree {
  long long v;
  long long son[2];
};

long long n;
long long q[2][1 + NMAX];
long long len[1 + NMAX];
long long no[1 + NMAX];
long long res;
Tree arb[1 + 2 * NMAX];

void dfs(long long pos, long long code, long long level) {
  if(arb[pos].son[0] != 0) {
    dfs(arb[pos].son[0], code * 2, level + 1);
    dfs(arb[pos].son[1], code * 2 + 1, level + 1);
  }

  len[pos] = level;
  no[pos] = code;
}

void solve() {
  long long l[2] = {1, 1};
  long long r[2] = {n, 0};
  long long x = n;

  while(l[0] + l[1] <= r[0] + r[1]) {
    x++;
    for(long long i = 0; i <= 1; i++) {
      long long p = 0;
      long long sz = INF;
      for(long long j = 0; j <= 1; j++) {
        if(arb[q[j][l[j]]].v < sz && l[j] <= r[j]) {
          p = j;
          sz = arb[q[j][l[j]]].v;
        }
      }
      arb[x].son[i] = q[p][l[p]];
      arb[x].v += arb[q[p][l[p]]].v;
      l[p]++;
    }
    res += arb[x].v;
    q[1][++r[1]] = x;
  }
  dfs(x, 0, 0);
}

int main()
{
  in >> n;
  for(long long i = 1; i <= n; i++) {
    in >> arb[i].v;
    q[0][i] = i;
  }

  solve();

  out << res << '\n';
  for(long long i = 1; i <= n; i++) {
    out << len[i] << ' ' << no[i] << '\n';
  }

  in.close();
  out.close();
  return 0;
}