Cod sursa(job #2738026)

Utilizator StanSiBranBranSiStan StanSiBran Data 5 aprilie 2021 13:43:41
Problema Coduri Huffman Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
#define ll long long
#define ld long double

using namespace std;

const ll MOD = 1e9 + 7;
const ll INF = 1e9;
const int N = 1e6 + 1;

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

int n, x, nod;
deque<pair<long long, int> >q1, q2;
int son1[2 * N], son2[2 * N];
ll val[2 * N], ans;
ll sol[N];
int len[N];

void dfs (int nr, ll val, int depth = 0) {
  if (nr <= n) {
    sol[nr] = val;
    len[nr] = depth;
    return;
  }
  dfs(son1[nr], val * 2, depth + 1);
  dfs(son2[nr], val * 2 + 1, depth + 1);
}

int main()
{
  fin >> n;
  for (int i = 1; i <= n; i++) {
    fin >> x;
    val[i] = x;
    q1.push_back({x, i});
  }
  nod = n;
  while (q1.size() + q2.size() > 1) {
    vector<pair<long long, int> >lol;
    if (q1.size() > 0)
      lol.push_back(q1[0]);
    if (q1.size() > 1)
      lol.push_back(q1[1]);
    if (q2.size() > 0)
      lol.push_back(q2[0]);
    if (q2.size() > 1)
      lol.push_back(q2[1]);
    sort(lol.begin(), lol.end());
    nod++;
    son1[nod] = lol[0].second;
    son2[nod] = lol[1].second;
    val[nod] = lol[0].first + lol[1].first;
    ans += val[nod];
    q2.push_back({val[nod], nod});
    if (q1.size() > 0 && (q1[0] == lol[0] || q1[0] == lol[1]))
      q1.pop_front();
    if (q1.size() > 0 && (q1[0] == lol[0] || q1[0] == lol[1]))
      q1.pop_front();
    if (q2.size() > 0 && (q2[0] == lol[0] || q2[0] == lol[1]))
      q2.pop_front();
    if (q2.size() > 0 && (q2[0] == lol[0] || q2[0] == lol[1]))
      q2.pop_front();
  }
  fout << ans << "\n"; 
  dfs(nod, 0);
  for (int i = 1; i <= n; i++)
    fout << len[i] << " " << sol[i] << "\n";
  return 0;
}