Cod sursa(job #2483167)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 29 octombrie 2019 14:03:00
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.51 kb
#include <fstream>
#include <vector>
#include <deque>
#define DIM 1000001

using namespace std;

ifstream fin ("huffman.in");
ofstream fout ("huffman.out");
long long val[DIM];
int lg[DIM];
int n,i,cost;
deque < pair<long long,int> > s1,s2;
pair <int,int> L[DIM*2];
void dfs (int nod, int lg_nod, long long val_nod){

    if (!L[nod].first) /// nu am fii
        return;

    int fiu_st = L[nod].first, fiu_dr = L[nod].second;
    if (fiu_st <= n){
        lg[fiu_st] = 1 + lg_nod;
        val[fiu_st] = (val_nod<<1);
    }
    if (fiu_dr <= n){
        lg[fiu_dr] = 1 + lg_nod;
        val[fiu_dr] = (val_nod<<1) + 1;
    }
    dfs (fiu_st,1+lg_nod,(val_nod<<1));
    dfs (fiu_dr,1+lg_nod,(val_nod<<1)+1);
}
int main (){

    fin>>n;
    for (i=1;i<=n;i++){
        fin>>cost;
        s1.push_back(make_pair(cost,i));
    }
    /// construiesc un arbore binar cu 2*n-1 noduri
    /// tin doua stive pt ca trb sa extrag cele mai mici doua minime
    long long sol = 0;
    for (i=n+1;i<=2*n-1;i++){
        /// vreau cele mai mici doua elemente
        pair <long long,int> x,y;

        /// iau doua elemente din prima coada, doua din a doua, sau unul din una si unul din alta
        /// aleg primul element
        if (s1.size() && s2.size()){
            if (s1.front().first <= s2.front().first){
                x = s1.front();
                s1.pop_front();
            } else {
                x = s2.front();
                s2.pop_front();
            }
        } else {
            if (s1.size()){
                x = s1.front();
                s1.pop_front();
            } else {
                x = s2.front();
                s2.pop_front();
            }}

        /// acum fac acelasi lucru pt al doilea
        if (s1.size() && s2.size()){
            if (s1.front().first <= s2.front().first){
                y = s1.front();
                s1.pop_front();
            } else {
                y = s2.front();
                s2.pop_front();
            }
        } else {
            if (s1.size()){
                y = s1.front();
                s1.pop_front();
            } else {
                y = s2.front();
                s2.pop_front();
            }}

        long long cost = x.first + y.first;
        sol += cost;
        L[i] = make_pair(x.second,y.second);
        s2.push_back(make_pair(cost,i));
    }



    fout<<sol<<"\n";
    dfs (2*n-1,0,0);
    for (i=1;i<=n;i++)
        fout<<lg[i]<<" "<<val[i]<<"\n";



    return 0;
}