Cod sursa(job #2920098)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 22 august 2022 00:17:14
Problema Coduri Huffman Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

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

const int dim=3e6+9;

int n,cost_total;
int cost[dim],fv[dim];
int len[dim],cod[dim];
int l[dim],r[dim];

priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;

void dfs(int nod,int cod_curent,int lungime_curenta){
    len[nod]=lungime_curenta;
    cod[nod]=cod_curent;
    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{
        cost_total+=cost[nod]*lungime_curenta;
    }
}

signed main(){
        fin>>n;
    for(int i=1;i<=n;i++){
        fin>>cost[i];
        pq.push({cost[i],i});
    }
    int nr=n;
    while(pq.size()>=2){
        int x=pq.top().second;
        pq.pop();
        int y=pq.top().second;
        pq.pop();
        nr++;
        l[nr]=x,r[nr]=y;
        cost[nr]=cost[x]+cost[y];
        pq.push({cost[nr],nr});
    }
    dfs(2*n-1,0,0);
        fout<<cost_total<<'\n';
    for(int i=1;i<=n;i++){
        fout<<len[i]<<' '<<cod[i]<<'\n';
    }
}