Cod sursa(job #3001390)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 13 martie 2023 16:28:54
Problema Coduri Huffman Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");

long long n;

struct node {
    node* left;
    node* right;
    long long val;
    long long freq;
    node(node* _left, node *_right, long long _val, long long _freq) 
        : left(_left), 
        right(_right), 
        val(_val), 
        freq(_freq) {}

    ~node() {
        if (left) delete[] left;
        left = nullptr;

        if (right) delete[] right;
        right = nullptr;
    }
};

queue<node*> q[2];
long long lgmin;
pair<long long, long long> ans[1000005];

void dfs(node *nod, long long curr, long long pwr, long long dist) {

    if (nod->val != 0) {
        ans[nod->val] = make_pair(dist, curr);
        lgmin += dist * nod->freq;
        return;
    }

    dfs(nod->left, curr * 2, 2 * pwr, dist + 1);
    dfs(nod->right, curr * 2 + 1, 2 * pwr, dist + 1);
}


int main() {
    in>>n;
    long long x;
    for (int i = 1; i <= n; i++) {
        in>>x;
        q[0].push(new node(nullptr, nullptr, i, x));
    }

    int care = 1;
    // q[care] - coada in care bag
    // q[care ^ 1] - coada din care bag
    do {
        while (!q[care ^ 1].empty()) {
            node* unu = q[care ^ 1].front();
            q[care ^ 1].pop();

            if (q[care].empty() || (!q[care ^ 1].empty() && (q[care ^ 1].front()->freq < q[care].front()->freq))) {

                node* doi = q[care ^ 1].front();
                q[care ^ 1].pop();

                q[care].push(new node(unu, doi, 0LL, unu->freq + doi->freq));

            } else {
                node* doi = q[care].front();
                if (unu->freq > doi->freq)
                    swap(unu, doi);
                q[care].pop();
                q[care].push(new node(unu, doi, 0LL, unu->freq + doi->freq));
            }
        }
        care = care ^ 1;

    } while (q[care ^ 1].size() != 1);

    dfs(q[care ^ 1].front(), 0, 1, 0);

    out<<lgmin<<'\n';
    for (int i = 1; i <= n; i++) {
        out<<ans[i].first<<" "<<ans[i].second<<'\n';
    }    
    
}