Cod sursa(job #2498002)

Utilizator divianegoescuDivia Negoescu divianegoescu Data 23 noiembrie 2019 13:21:26
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#define K 1000002
#define INF 1000000000000000001LL
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n,i,j,k,t,lg[K];
long long v[2*K],cod[K],total;
pair <int,int> L[2*K];
void dfs(int nod,int niv,long long nr){
    if(nod<=n){///e frunza,ma opresc
        lg[nod]=niv;
        cod[nod]=nr;
        total+=niv*v[nod];
        return;
    }
    dfs(L[nod].first,niv+1,nr*2);/// pe stanga adaug '0' la prefix
    dfs(L[nod].second,niv+1,nr*2+1);///pe dreapta '1' (baza 2)
}
int main(){
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>v[i];
    t=2*n-1;///in total o sa am t noduri in arbore
    for(i=n+1;i<=t+3;i++)
        v[i]=INF;///ca sa nu mai pun conditii sa nu depaseasca n
    i=1;
    j=n+1;
    k=n;
    while(k<t){
        if(v[i+1]<=v[j]){///iau 2 de la inceput
            v[++k]=v[i]+v[i+1];
            L[k]={i,i+1};
            i+=2;
        }
        else if(v[j+1]<=v[i]){///iau 2 de la sfarsit
            v[++k]=v[j]+v[j+1];
            L[k]={j,j+1};
            v[j]=v[j+1]=INF;///ca sa nu mi le mai ia iar cand ajunge i>n
            j+=2;
        }
        else{///unul de la inceput,unul de la sfarsit
            v[++k]=v[i]+v[j];
            L[k]={i,j};
            v[j]=INF;
            i++;
            j++;
        }
    }
    dfs(t,0,0);///incep cu a t-a muchie pe nivel 0 si cod 0
    fout<<total<<"\n";
    for(i=1;i<=n;i++)
        fout<<lg[i]<<" "<<cod[i]<<"\n";
    return 0;
}