Cod sursa(job #2920103)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 22 august 2022 00:41:44
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin ("huffman.in");
ofstream fout("huffman.out");

const int dim=1e6+9;

int n;
long long cost[2*dim],cost_total;
int len[dim];
long long cod[dim];
int l[2*dim],r[2*dim];

queue<int>q1,q2;

void dfs(int nod,long long cod_curent,int lungime_curenta){
    if(l[nod]&&r[nod]){
        dfs(l[nod],cod_curent*2  ,lungime_curenta+1);
        dfs(r[nod],cod_curent*2+1,lungime_curenta+1);
    }else{
        len[nod]=lungime_curenta;
        cod[nod]=cod_curent;
        cost_total+=cost[nod]*lungime_curenta;
    }
}

signed main(){
        fin>>n;
    for(int i=1;i<=n;i++){
        fin>>cost[i];
        q1.push(i);
    }
    int nr=n;
    while(q1.size()+q2.size()>=2){
        int x,y;

        if(q1.empty() || (!q2.empty() && cost[q1.front()]>cost[q2.front()])){
            x=q2.front();
            q2.pop();
        }else{
            x=q1.front();
            q1.pop();
        }

        if(q1.empty() || (!q2.empty() && cost[q1.front()]>cost[q2.front()])){
            y=q2.front();
            q2.pop();
        }else{
            y=q1.front();
            q1.pop();
        }

        nr++;
        l[nr]=x,r[nr]=y;
        cost[nr]=cost[x]+cost[y];
        q2.push(nr);
    }
    dfs(2*n-1,0,0);
        fout<<cost_total<<'\n';
    for(int i=1;i<=n;i++){
        fout<<len[i]<<' '<<cod[i]<<'\n';
    }
}