Cod sursa(job #2816381)

Utilizator ElizaTElla Rose ElizaT Data 11 decembrie 2021 12:23:34
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1e6;
int n;
long long ans = 0;
struct node {
    long long val;
    int left,right,l;
}nodes[NMAX * 2 + 5];

void dfs(int nod, int ll, long long value) {
    if (nod > 0) {
        nodes[nod].l = ll;
        nodes[nod].val = value;
        dfs(nodes[nod].left, ll + 1, value << 1);
        dfs(nodes[nod].right, ll + 1, (value + 1) << 1);
    }
}
void join(int u, int v, int padre) {
    nodes[padre].val = nodes[u].val + nodes[v].val;
    nodes[padre].left = u;
    nodes[padre].right = v;
    ans += nodes[padre].val;
}
void huffman() {
    int ii = 1,jj = n + 2,m = n + 2,a,b;
    nodes[n + 1].val = LONG_LONG_MAX;
    while (ii < n || jj < m - 1) {
        if (jj < m && nodes[jj].val < nodes[ii].val)
            a = jj++;
        else
            a = ii++;
        if (jj < m && nodes[jj].val < nodes[ii].val)
            b = jj++;
        else
            b = ii++;
        join(a, b, m);
        m++;
    }
    dfs(m - 1, 0, 0);
}
int main()
{
    ifstream fin("huffman.in");
    ofstream fout("huffman.out");
    fin >> n;
    for (int i = 1;i <= n;i++)
        fin >> nodes[i].val;
    huffman();
    fout << ans << '\n';
    for (int i = 1;i <= n;i++)
        fout << nodes[i].l << " " << nodes[i].val << '\n';
    return 0;
}