Cod sursa(job #2617413)

Utilizator rares9991Matisan Rares-Stefan rares9991 Data 21 mai 2020 16:58:03
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>

using namespace std;

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

const int N=1e6;

int n, st[2*N], dr[2*N], p, u, v[N], nr, lg[2*N], q[2*N];
long long codul[2*N], val[2*N];

void reuniune(int x, int y)
{
    ++nr;
    val[nr]=val[x]+val[y];
    st[nr] = x;
    dr[nr] = y;
    q[++u]=nr;
}

void preordine(int x)
{
    if( st[x] != 0)
    {
        codul[st[x]]=codul[x]*2;
        lg[st[x]]=1+lg[x];
        preordine(st[x]);
    }
    if(dr[x]!=0)
    {
        codul[dr[x]]=codul[x]*2+1;
        lg[dr[x]]=1+lg[x];
        preordine(dr[x]);
    }
}

int lungime(long long x)
{
    int l=0;
    do
    {
        l++;
        x/=2;
    }
    while(x!=0);
    return l;
}

int main()
{
    in>>n;
    for(int i=1; i<=n; i++)
        in>>val[i];
    u=-1;
    int i=3;
    nr=n;
    reuniune(1, 2);
    while(i<=n or p<u)
    {
        if(i<=n and val[i]<=val[q[p]])
        {
            if(i < n and val[i+1]<=val[q[p]])
                reuniune(i, i+1), i+=2;
            else
                reuniune(i++, q[p++]);
        }
        else if(i<=n and (p==u or val[i]<=val[q[p+1]]))
            reuniune(q[p++], i++);
        else
            reuniune(q[p], q[p+1]), p+=2;
    }
    codul[nr]=0;
    preordine(nr);
    long long int sum=0;

    for(int i=n+1; i<=nr; i++)
        sum += val[i];

    out<<sum<<"\n";

    for(int i=1; i<=n; i++)
        out<<lg[i]<<" "<<codul[i]<<"\n";
    return 0;
}