Cod sursa(job #2622960)

Utilizator BogdanFarcasBogdan Farcas BogdanFarcas Data 2 iunie 2020 12:44:01
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <queue>

using namespace std;

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

const int N=2e6+1;
queue<int>q1,q2;
int st[N],dr[N],nivel[N];
int nr,n;
long long ans;
long long val[N],cod[N];

void adauga(int x,int y)
{
    val[++nr]=val[x]+val[y];
    st[nr]=x;
    dr[nr]=y;
    q2.push(nr);
}

int minim()
{
    if(q1.empty())
    {
        int mini=q2.front();
        q2.pop();
        return mini;
    }
    if(q2.empty())
    {
        int mini=q1.front();
        q1.pop();
        return mini;
    }
    if(val[q1.front()]<val[q2.front()])
    {
        int mini=q1.front();
        q1.pop();
        return mini;
    }
    else
    {
        int mini=q2.front();
        q2.pop();
        return mini;
    }
}

long long rez(int x)
{
    long long sum=0;
    if(st[x]!=0)
    {
        cod[st[x]]=cod[x]*2;
        nivel[st[x]]=nivel[x]+1;
        cod[dr[x]]=cod[x]*2+1;
        nivel[dr[x]]=nivel[x]+1;
        sum+=val[x]+rez(st[x])+rez(dr[x]);
    }
    return sum;
}

int main()
{
    fin>>n;
    nr=n;
    for(int i=1;i<=n;i++)
    {
        fin>>val[i];
        q1.push(i);
    }
    while(q1.size()+q2.size()>1)
    {
        int x=minim();
        int y=minim();
        adauga(x,y);
    }
    for(int i=n+1;i<=nr;i++)
    {
        ans+=val[i];
    }
    fout<<ans<<'\n';
    rez(nr);
    for(int i=1;i<=n;i++)
    {
        fout<<nivel[i]<<" "<<cod[i]<<'\n';
    }
    return 0;
}