Cod sursa(job #1999359)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 10 iulie 2017 23:38:28
Problema Coduri Huffman Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <algorithm>
#include <queue>

using namespace std;

struct nod{
    long long x;
    int f[2];
}nod[2000005];

int n;
long long sol, lg[1000005], cd[1000005];
vector< pair<long long, int> > v;

void dfs(int poz, int cod, int level)
{
    if(nod[poz].f[0]){
        dfs(nod[poz].f[0], cod*2, level+1);
        dfs(nod[poz].f[1], cod*2+1, level+1);
    }else{
        lg[poz] = level;
        cd[poz] = cod;
        sol += level*nod[poz].x;
    }
}

int main()
{
    ifstream fin ("huffman.in");
    ofstream fout ("huffman.out");
    fin >> n;
    for (int i = 1; i <= n; ++i){
        fin >> nod[i].x;
        v.push_back(make_pair(-nod[i].x, i));
    }
    make_heap(v.begin(), v.end());
    int k = n;
    while(v.size() > 1){
        ++k;
        for(int i = 0; i < 2; ++i){
            pair<long long, int> p = *(v.begin());
            pop_heap(v.begin(), v.end());
            v.pop_back();
            nod[k].f[i] = p.second;
            nod[k].x -= p.first;
        }
        v.push_back(make_pair(-nod[k].x, k));
        push_heap(v.begin(), v.end());
    }
    dfs(k, 0, 0);
    fout << sol << "\n";
    for (int i = 1; i <= n; ++i)
        fout << lg[i] << " " << cd[i] << "\n";
    fin.close();
    fout.close();
    return 0;
}