Cod sursa(job #2793327)

Utilizator cristi_macoveiMacovei Cristian cristi_macovei Data 3 noiembrie 2021 14:49:43
Problema Coduri Huffman Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
 
#define inout(f) std::ifstream in((f) + (std::string) ".in");std::ofstream out((f) + (std::string) ".out")
#define d(x) std::cout << x << std::endl
#define dm(msg, x) std::cout << msg << x << std::endl
 
const int NMAX = 1e6;
 
class Heap {
private:
  int64_t value[1 + 2 * NMAX] = {0};
  std::queue<int> a;
  std::queue<int> b;

public:
  Heap() = default;

  void emplace(int64_t val, int id, bool toA = false) {
    value[id] = val;
    if (toA)
      a.push(id);
    else
      b.push(id);
  }
 
  std::pair<int64_t, int> top() {
    if (a.empty())
      return {value[b.front()], b.front()};
 
    if (b.empty())
      return {value[a.front()], a.front()};
 
    if (value[a.front()] < value[b.front()])
      return {value[a.front()], a.front()};
 
    return {value[b.front()], b.front()};
  }
 
  void pop() {
    if (a.empty())
      b.pop();
 
    else if (b.empty())
      a.pop();
 
    else if (value[a.front()] < value[b.front()])
      a.pop();
 
    else 
      b.pop();
  }
 
  size_t size() {
    return a.size() + b.size();
  }
};
 
std::vector<int> graph[1 + 2 * NMAX];
 
Heap heap;
 
int64_t n;
std::pair<int, int64_t> ans[1 + NMAX];
int freq[1 + NMAX];
 
void dfs(int node, int depth, int64_t repr) {
  // std::printf("node %d, depth %d, repr %d\n", node, depth, repr);
  if (node <= n)
    ans[node] = { depth, repr - (1 << depth) };
  
  int cnt = 0;
 
  for (int i : graph[node]) {
    dfs(i, depth + 1, 2 * repr + cnt);
    cnt++;
  }
}
 
int main() {
  inout("huffman");
 
  in >> n;
 
  for (int i = 1; i <= n; ++i) {
    int a;
    in >> a;
 
    heap.emplace(a, i, true);
    freq[i] = a;
  }
 
  int id = n;
  while (heap.size() > 1) {
    auto i = heap.top();
    heap.pop();
 
    auto j = heap.top();
    heap.pop();
 
    heap.emplace(i.first + j.first, ++id);
 
    graph[id].push_back(i.second);
    graph[id].push_back(j.second);
  }
 
  // dfs(id, 0, 1);
 
  int64_t len = 0;
  for (int i = 1; i <= n; ++i) 
    len += ans[i].first * freq[i];
  out << len << '\n';
 
  for (int i = 1; i <= n; ++i) 
    out << ans[i].first << ' ' << ans[i].second << '\n';
  
 
  return 0;
}