Cod sursa(job #2618038)

Utilizator andreisontea01Andrei Sontea andreisontea01 Data 23 mai 2020 15:40:33
Problema Coduri Huffman Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1000005;

#define lg first
#define bin second

int v[MAXN];
pair<int, long long> cod[MAXN];
queue<long long> init, intern;
vector<int> graf[2 * MAXN];

long long ans = 0;
int root, pnrm, pint;

long long getmin(bool &isint){
    long long best = 1e18;
    if(!init.empty()) best = init.front();
    if(!intern.empty() && best > intern.front()) best = intern.front();
    if(best == init.front()){
        pnrm++;
        init.pop();
    }
    else{
        isint = 1;
        pint++;
        ans += intern.front();
        intern.pop();
    }
    return best;
}

void dfs(int crt, int cif){
    int bit = 0;
    for(auto x: graf[crt]){
        cod[x].lg = cif + 1;
        cod[x].bin = cod[crt].bin * 2 + bit;
        dfs(x, cif + 1);
        bit = 1 - bit;
    }
}

int main()
{
    ifstream fin("huffman.in");
    ofstream fout("huffman.out");
    int n, root;
    fin >> n;
    for(int i = 1; i <= n; ++i){
        fin >> v[i];
        init.push(v[i]);
    }
    pnrm = 0; pint = root = n;
    while(!init.empty() || intern.size() != 1){
        bool isx = 0, isy = 0;
        long long x = getmin(isx), y = getmin(isy);
        intern.push(x + y);
        root++;
        if(!isx && !isy){
            graf[root].push_back(pnrm - 1);
            graf[root].push_back(pnrm);
        }
        else if(isx && isy){
            graf[root].push_back(pint - 1);
            graf[root].push_back(pint);
        }
        else{
            graf[root].push_back(pnrm);
            graf[root].push_back(pint);
        }
    }
    ans += intern.front();
    fout << ans << "\n";
    dfs(root, 0);
    for(int i = 1; i <= n; ++i) fout << cod[i].lg << " " << cod[i].bin << "\n";
    return 0;
}