Cod sursa(job #2791843)

Utilizator Stefan_DomuncoStefan Domunco Stefan_Domunco Data 31 octombrie 2021 11:14:31
Problema Coduri Huffman Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.56 kb
#include <bits/stdc++.h>
#define N NULL
#define ll long long
using namespace std;

ifstream fin("huffman.in");
ofstream fout("huffman.out");
const int NMAX = 1e6+6;
struct nod
{
    ll val;
    int poz;
    nod *left_son, *right_son;

    nod(ll _val, nod *_left_son, nod *_right_son, int _poz = -1)
    {
        val = _val;
        left_son = _left_son;
        right_son = _right_son;
        poz = _poz;
    }

    nod()
    {

    }
};

///w - heap ul pe care il voi modifica
///init - nodurile initiale (caracterele de la care plec)
vector <nod> w;

bool cmp(nod a, nod b)
{
    return a.val > b.val;
}

struct sol
{
    ll adancime, dec;
};

sol rasp[NMAX];
ll lg;

///0 pe stanga si 1 pe dreapta
void parc(nod *node, ll ad, ll val)
{
    lg += node -> val;
    //fout << node->val << ' ';
    ///daca e o frunza
    if(node -> poz != -1)
        lg -= node -> val, rasp[node->poz].adancime = ad, rasp[node->poz].dec = val;

    if(node -> left_son != N)
        parc(node->left_son, ad+1, (val)<<1);

    if(node -> right_son != N)
        parc(node->right_son, ad+1, (val+1)<<1);

//    fout << node -> val << ' ';
//    if(node -> left_son != N)
//        fout << node -> left_son -> val << ' ';
//
//    if(node -> right_son != N)
//        fout << node -> right_son -> val << ' ';
//    fout << '\n';
//    if(node -> left_son != N)
//        parc(node -> left_son, ad+1, val+1);
//
//    if(node -> right_son != N)
//        parc(node -> right_son, ad+1, val+1);
}


int main()
{
    int n, i;
    ll val;
    fin >> n;
    for(i = 1; i <= n; ++i)
    {
        fin >> val;
        w.push_back(nod(val, N, N, i));
    }

    make_heap(w.begin(), w.end(), cmp);
//    for(vector<nod>::iterator it = w.begin(); it != w.end(); ++it)
//        fout << it -> val << ' ';
    nod *first, *second, *root;

    while(w.size() > 1)
    {
        first = new nod;
        second = new nod;

        *first = w[0];
        pop_heap(w.begin(), w.end(), cmp);
        w.pop_back();

        *second = w[0];
        pop_heap(w.begin(), w.end(), cmp);
        w.pop_back();

        w.push_back(nod(first->val + second->val, first, second));
        push_heap(w.begin(), w.end(), cmp);
    }
    root = new nod;
    *root = w[0];
    w.pop_back();

    parc(root, 0ll, 0ll);
//    ll lg = 0;
//
//    for(i = 1; i <= n; ++i)
//        lg += rasp[i].adancime * init[i].val;
    fout << lg << '\n';
    for(i = 1; i <= n; ++i)
        fout << rasp[i].adancime << ' ' << rasp[i].dec << '\n';

    return 0;
}