Cod sursa(job #2445797)

Utilizator Leonard123Mirt Leonard Leonard123 Data 5 august 2019 15:48:17
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>
using namespace std;
#define maxn 1000005
#define inf 1LL * 1000000 * 1000000
int coada[2][maxn],n,prim[2],ultim[2],fiu[2][maxn*2],k,aux,lg[maxn];
long long nod[maxn*2],sol=0,m,coduri[maxn];

ifstream cin("huffman.in");
ofstream cout ("huffman.out");

void huffman(int nod, long long cod, int nivel){
    if(fiu[0][nod]){
        huffman(fiu[0][nod], cod*2, nivel+1);
        huffman(fiu[1][nod], cod*2+1, nivel+1);
        return;
    }
    lg[nod]=nivel;
    coduri[nod]=cod;
}

void lungime(){
    prim[1]=prim[0]=1;
    ultim[0]=k=n;
    while(prim[0]+prim[1]<=ultim[0]+ultim[1]){
        ++k;
        for(int i=0; i<2; i++){
                m=inf,aux=0;
            for(int j=0; j<2; j++)
                if(nod[coada[j][prim[j]]]<m && prim[j]<=ultim[j])
                    m=nod[coada[j][prim[j]]], aux=j;
            nod[k]+=m;
            fiu[i][k]=coada[aux][prim[aux]++];
        }
        coada[1][++ultim[1]]=k;
        sol+=nod[k];
    }
    cout<<sol<<'\n';
    huffman(k,0,0);
    for(int i=1; i<=n; i++)
        cout<<lg[i]<<' '<<coduri[i]<<'\n';
}

void solve(){
    lungime();
}

int main(){
    cin>>n;
    for(int i=1; i<=n; i++){
        coada[0][i]=i;
        cin>>nod[i];
    }
    solve();
    return 0;
}