Cod sursa(job #2483023)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 29 octombrie 2019 10:17:57
Problema Coduri Huffman Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.35 kb
#include <fstream>
#include <vector>
#include <deque>
#define DIM 2000000

using namespace std;

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

    if (L[nod].empty())
        return;

    int fiu_st = L[nod][0], fiu_dr = L[nod][1];
    lg[fiu_st] = 1 + lg[nod];
    lg[fiu_dr] = 1 + lg[nod];
    val[fiu_st] = (val[nod]<<1);
    val[fiu_dr] = (val[nod]<<1) + 1;
    dfs (fiu_st);
    dfs (fiu_dr);
}
int main (){

    fin>>n;
    for (i=1;i<=n;i++){
        fin>>cost[i];
        s1.push_back(make_pair(cost[i],i));
    }
    /// construiesc un arbore binar cu 2*n-1 noduri
    /// tin doua stive pt ca trb sa extrag cele mai mici doua minime
    for (i=n+1;i<=2*n-1;i++){
        /// vreau cele mai mici doua elemente
        pair <int,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();
            }}

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



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



    return 0;
}