Cod sursa(job #2972891)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 30 ianuarie 2023 16:30:50
Problema Coduri Huffman Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <queue>

using namespace std;

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

const long long max_size = 1e6 + 1, INF = 1e18 + 1;

struct str{
    long long val, nod, st, dr;
};

long long n;
str a[2 * max_size];
queue <long long> q[2];

long long mn ()
{
    long long ind1, ind2;
    if (q[0].empty())
    {
        ind1 = 0;
    }
    else
    {
        ind1 = q[0].front();
    }
    if (q[1].empty())
    {
        ind2 = 0;
    }
    else
    {
        ind2 = q[1].front();
    }
    if (a[ind1].val < a[ind2].val)
    {
        q[0].pop();
        return ind1;
    }
    q[1].pop();
    return ind2;
}

void dfs (long long nod, long long depth, long long cod)
{
    if (nod <= n)
    {
        a[nod].val = cod;
        a[nod].nod = depth;
        return;
    }
    dfs(a[nod].st, depth + 1, 2 * cod);
    dfs(a[nod].dr, depth + 1, 2 * cod + 1);
}

signed main ()
{
    a[0].val = INF;
    in >> n;
    for (long long i = 1; i <= n; i++)
    {
        in >> a[i].val;
        a[i].nod = i;
        q[0].push(i);
    }
    long long ind = n + 1, lg = 0;
    while (q[0].size() + q[1].size() > 1)
    {
        long long x = mn(), y = mn();
        a[ind] = {a[x].val + a[y].val, ind, x, y};
        q[1].push(ind);
        lg += a[ind].val;
        ind++;
    }
    out << lg << '\n';
    dfs(ind - 1, 0, 0);
    for (long long i = 1; i <= n; i++)
    {
        out << a[i].nod << " " << a[i].val << '\n';
    }
    in.close();
    out.close();
    return 0;
}