Cod sursa(job #2978487)

Utilizator DKMKDMatei Filibiu DKMKD Data 13 februarie 2023 20:08:40
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

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

const int CMAX = 2e6 + 15;;

int n;
long long temp;
struct noduri {
    int st, dr, niv;
    long long val;
}heap[CMAX];

void read() {
    f >> n;
    for (int i = 1; i <= n; i++)
        f >> heap[i].val;
}

void parcurgere_srd(int nod, int niv, long long val) {
    if (nod > 0) {
        heap[nod].val = val;
        heap[nod].niv = niv;
        parcurgere_srd(heap[nod].st, niv + 1, val * 2);
        parcurgere_srd(heap[nod].dr, niv + 1, (val * 2) + 1);
    }
}

void huffman() {
    heap[n + 1].val = LONG_LONG_MAX;
    int i, j, stop, st, dr;
    i = 1;
    j = n + 2;
    stop = n + 1;
    while (i < n + 1 || j < stop) {
        if (j <= stop && heap[j].val < heap[i].val)
            st = j++;
        else {
            st = i++;
        }
        if (j <= stop && heap[j].val < heap[i].val) {
            dr = j++;
        }
        else
        {
            dr = i++;
        }
        heap[++stop].val = heap[st].val + heap[dr].val;
        heap[stop].st = st;
        heap[stop].dr = dr;
        temp = temp + heap[stop].val;
    }
    parcurgere_srd(stop, 0, 0);
}

int main()
{
    read();
    huffman();
    g << temp << '\n';
    for (int i = 1; i <= n; i++)
        g << heap[i].niv << " " << heap[i].val << '\n';
    return 0;
}