Cod sursa(job #2495912)

Utilizator MihneaGhiraMihnea MihneaGhira Data 19 noiembrie 2019 23:17:16
Problema Coduri Huffman Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include<fstream>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");

long long n,H,m,niv,I,J,s;
long long nivel[1000010],huffman[1000010];

pair<int,int> L[2000010],v[2000010];

void dfs(long long nod, long long cod){
    niv++;

    if(nod<=H){
        huffman[nod]=cod;
        nivel[nod]=niv;

        s+= (nivel[nod]*v[nod]);

    }
    else{
        dfs(L[nod].first, (cod<<1)+0);
        dfs(L[nod].second,(cod<<1)+1);
    }

    niv--;
}

int main(){
    fin>>n;m=2*n-1;H=n;
    for(int i=1;i<=n;i++){
        fin>>v[i];
        v[i+n]=1<<30;
    }
    v[m+2]=v[m+3]=1<<30;
    I=1;J=n+1;
    while(n<m){
        if(v[I+1]<=v[J]){
            v[++n]=v[I]+v[I+1];
            L[n]=make_pair(I,I+1);
            I+=2;

            continue;
        }

        if(v[J+1]<=v[I]){
            v[++n]=v[J]+v[J+1];
            v[J]=v[J+1]=1<<30;
            L[n]=make_pair(J,J+1);
            J+=2;

            continue;
        }

        v[++n]=v[I]+v[J];
        v[J]=1<<30;
        L[n]=make_pair(I,J);
        I++;J++;
    }

    niv=-1;
    dfs(m,0);

    fout<<s<<"\n";
    for(int i=1;i<=H;i++)
        fout<<nivel[i]<<" "<<huffman[i]<<"\n";

    return 0;
}