Cod sursa(job #2659368)

Utilizator evelina.nitoiuNitoiu Evelina evelina.nitoiu Data 16 octombrie 2020 17:50:52
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");

long long v[2000005];

queue<int> init, intern;

int n,nr;
long long s;

int mu[2000005][2];

long long rez[1000005];

int lung[1000005];

long long getmin(){
    int ret = 0;
    if(!init.empty() && (intern.empty() || v[init.front()] <= v[intern.front()])){
        ret = init.front();
        init.pop();
        return ret;
    }
    ret = intern.front();
    intern.pop();
    return ret;
}

void dfs(int ind_nod,long long cod,int l){
    if(ind_nod<=n){
        rez[ind_nod]=cod;
        lung[ind_nod]=l;
        return;
    }
    dfs(mu[ind_nod][0],cod<<1,l+1);
    dfs(mu[ind_nod][1],(cod<<1)|1,l+1);
}

int main()
{
    in>>n;
    for(int i=1;i<=n;i++){
        in>>v[i];
        init.push(i);
}
    nr=n;
    while((int)init.size() + (int)intern.size() > 1){
        long long a,b;
        a=getmin();
        b=getmin();
        int c;
        nr++;
        c=nr;
        v[c]=v[a]+v[b];
        intern.push(c);
        mu[nr][0]=a;
        mu[nr][1]=b;
        s+=v[c];
    }
    dfs(nr,0,0);
    out<<s<<"\n";
    for(int i=1;i<=n;i++)
        out<<lung[i]<<" "<<rez[i]<<"\n";
    return 0;
}