Cod sursa(job #3135867)

Utilizator vladp1324Vlad Pasare vladp1324 Data 4 iunie 2023 16:31:12
Problema Coduri Huffman Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#define NMAX 10000001
#define INF 1LL * 1000000000 * 1000000000

using namespace std;

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

struct Nod{
    long long fr;
    int fiu[2];
} nod[2*NMAX];

int n, lg[2*NMAX];
long long total, b[2*NMAX];
bool used[2*NMAX];

void dfs(int poz, long long cod, int nivel){
    if(nod[poz].fiu[0]){
        dfs(nod[poz].fiu[0], cod*2, nivel+1);
        dfs(nod[poz].fiu[1], cod*2+1, nivel+1);
        return;
    }
    lg[poz] = nivel;
    b[poz] = cod;
}

void solve(){
    int nc = n;
    for(int l = 1; l <= n - 1; l++){
        nc++;
        for(int i = 0; i < 2; i++){
            int pozMin = 0;
            long long mn = INF;
            for(int j = 1; j < nc; j++){
                if(nod[j].fr < mn && !used[j]){
                    pozMin = j;
                    mn = nod[j].fr;
                }
            }
            used[pozMin] = true;
            nod[nc].fiu[i] = pozMin;
            nod[nc].fr += nod[pozMin].fr;
        }
        total += nod[nc].fr;
    }
    dfs(nc, 0, 0);
}

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++)
        fin >> nod[i].fr;
    solve();
    fout << total << '\n';
    for(int i = 1; i <= n; i++)
        fout << lg[i] << ' ' << b[i] << '\n';
    return 0;
}