Cod sursa(job #2761432)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 2 iulie 2021 09:51:57
Problema Coduri Huffman Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>
#include <iostream>
#include <queue>

using namespace std;

typedef long long ll;

const int N = (int) 2e6 + 7;
int n, k1[N], k2[N], len[N];
ll num[N];
priority_queue<pair<int, int>> pq;

void build(int a) {
  if (k1[a]) {
    len[k1[a]] = len[k2[a]] = 1 + len[a];
    num[k1[a]] = num[a];
    num[k2[a]] = num[a] + (1LL << len[a]);
    build(k1[a]);
    build(k2[a]);
  }
}

signed main() {
  freopen ("huffman.in", "r", stdin);
  freopen ("huffman.out", "w", stdout);

  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    pq.push({-x, i});
  }
  int y = n;
  ll sol = 0;
  while ((int) pq.size() > 1) {
    auto it1 = pq.top(); pq.pop();
    auto it2 = pq.top(); pq.pop();
    k1[++y] = it1.second;
    k2[y] = it2.second;
    pq.push({it1.first + it2.first, y});
    sol -= (it1.first + it2.first);
  }
  printf("%lld\n", sol);
  build(y);
  for (int i = 1; i <= n; i++) {
    printf("%d %lld\n", len[i], num[i]);
  }
  return 0;
}