Cod sursa(job #2495064)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 18 noiembrie 2019 20:24:28
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <iostream>
#include <climits>
#define x first
#define y second
#define dim 1000010
using namespace std;

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

long long n,i,j,v[2*dim],k,t,m,niv;
pair<int,int> l[2*dim]; ///fii
long long H[dim],C[dim],sum;

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

    if(nod<=k){
        C[nod]=cod;
        H[nod]=niv;
        sum+=H[nod]*v[nod];
    }else{
        dfs(l[nod].x,(cod<<1));
        dfs(l[nod].y,(cod<<1)+1);
    }

    niv--;
}

int main(){
    fin>>n;
    for(i=1;i<=n;i++){
        fin>>v[i];
        v[i+n]=LONG_LONG_MAX;
    }
    v[2*n+1]=v[2*n+2]=LONG_LONG_MAX;

    t=2*n-1;
    k=n;
    i=1; j=n+1;

    while(n<t){
        if(v[i+1]<=v[j]){
            v[++n]=v[i]+v[i+1];
            ///v[i]=v[i+1]=LONG_LONG_MAX;
            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]=LONG_LONG_MAX;
            l[n]=make_pair(j,j+1);
            j+=2;

            continue;
        }

        v[++n]=v[i]+v[j];
        v[j]=LONG_LONG_MAX;
        l[n]=make_pair(i,j);
        i++; j++;
    }

//    for(i=1;i<=t;i++)
//        cout<<l[i].x<<" "<<l[i].y<<"\n";

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

    fout<<sum<<"\n";
    for(i=1;i<=k;i++)
        fout<<H[i]<<" "<<C[i]<<"\n";

    return 0;
}