Cod sursa(job #2624770)

Utilizator mihai2003LLL LLL mihai2003 Data 5 iunie 2020 12:08:03
Problema Coduri Huffman Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <queue>

const int NMAX=1000005;

struct nod{
    int st,dr;
    long long val;
}v[2*NMAX];

struct rez{
    int lungime;
    long long nr;
}valf[NMAX];

int nart,n;
std::queue<int>q1,q2;
std::ifstream in("huffman.in");
std::ofstream out("huffman.out");

int getNod(){
    if(q1.empty()){
        int aux=q2.front();
        q2.pop();
        return aux;
    }
    if(q2.empty()){
        int aux=q1.front();
        q1.pop();
        return aux;
    }
    if(v[q1.front()].val<=v[q2.front()].val){
        int aux=q1.front();
        q1.pop();
        return aux;
    }
    int aux=q2.front();
    q2.pop();
    return aux;
}

void adauga(int x,int y){
    v[nart].val=v[x].val+v[y].val;
    v[nart].st=x;
    v[nart].dr=y;
    nart++;
}

void dfs(int nod,int dist,int val){
    if(v[nod].st==0 || v[nod].dr==0){
        valf[nod].lungime=dist;
        valf[nod].nr=val;
        return;
    }
    dfs(v[nod].st,dist+1,val);
    dfs(v[nod].dr,dist+1,val+(1LL<<dist));
}

int main(){
    long long sum=0;
    in>>n;
    for(int i=1;i<=n;i++)
        in>>v[i].val,q1.push(i);
    nart=n+1;
    while(q1.size()+q2.size()!=1){
        int nod1=getNod(),nod2=getNod();
        adauga(nod1,nod2);
        q2.push(nart-1);
    }
    int radacina=getNod();
    dfs(radacina,0,0);
    for(int i=n+1;i<nart;i++)
        sum+=v[i].val;
    out<<sum<<'\n';
    for(int i=1;i<=n;i++){
        long long rezx=0,lungime=valf[i].lungime,nr=valf[i].nr;
        for(int j=0;j<lungime;j++)
            if(nr & (1LL<<j))
                rezx+=(1LL<<(lungime-j-1));
        out<<lungime<<" "<<rezx<<'\n';
    }

    return 0;
}