Cod sursa(job #2917081)

Utilizator GrizzyProblemSolver79cNot telling GrizzyProblemSolver79c Data 3 august 2022 07:42:16
Problema Coduri Huffman Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;

struct Pair {
  int node;
  long long val;
  bool operator < (Pair o) const {
    if(val != o.val) {
      return val < o.val;
    } else {
      return node < o.node;
    }
  }
};

int const NMAX = 1000000;
int n;
int f[1 + NMAX];
long long ans[1 + NMAX];
long long len[1 + NMAX];
int le[1 + NMAX], ri[1 + NMAX];

void dfs(int from, long long val, long long dist) {
  if(le[from] <= n) {
    ans[le[from]] = 2*val;
    len[le[from]] = dist+1;
  } else {
    dfs(le[from], 2*val, dist+1);
  }
  if(ri[from] <= n) {
    ans[ri[from]] = 2*val+1;
    len[ri[from]] = dist+1;
  } else {
    dfs(ri[from], 2*val+1, dist+1);
  }
}

int main() {
  cin >> n;
  set<Pair> s;
  for(int i = 1; i <= n; i++) {
    cin >> f[i];
    s.insert({i, f[i]});
  }
  int index = n+1;
  for(int i = 1; i <= n-1; i++) {
    Pair p1 = *s.begin();
    s.erase(s.begin());
    Pair p2 = *s.begin();
    s.erase(s.begin());
    le[index] = p1.node;
    ri[index] = p2.node;
    s.insert({index, p1.val + p2.val});
    index++;
  }
  int root = (*s.begin()).node;
  dfs(root, 0, 0);
  for(int i = 1; i <= n; i++) {
    cout << len[i] << " " << ans[i] << "\n";
  }
}