Cod sursa(job #2626917)

Utilizator etienAndrone Stefan etien Data 9 iunie 2020 02:16:22
Problema Coduri Huffman Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include<fstream>
#include<queue>
#include<algorithm>

using namespace std;

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

long long n,i,x,s,nr;
queue<long long>q1,q2;
long long val[2000001],st[2000001],dr[2000001];
void adauga(long long x,long long y)
{
    val[++nr]=val[x]+val[y];
    st[nr]=x;
    dr[nr]=y;
    q2.push(nr);
}

pair<long long,pair<long long,int>>rez[2000001];
long long nr2;

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

void dfs(long long poz,long long val,long long cnt)
{
    if(st[poz]==0&&dr[poz]==0)
        {
            nr2++;
            rez[nr2].first=poz;
            rez[nr2].second.first=cnt;
            rez[nr2].second.second=val;
        }
    else
    {
        dfs(st[poz],val*2,cnt+1);
        dfs(dr[poz],val*2+1,cnt+1);
    }
}
int main()
{
    fin>>n;
    for(i=1; i<=n; i++)
    {
        fin>>x;
        q1.push(i);
        nr++;
        val[nr]=x;
    }
    while(q1.size()+q2.size()>1)
    {
        long long x=minim();
        long long y=minim();
        adauga(x,y);
    }
    for(i=n+1; i<=nr; i++)
        s+=val[i];
    fout<<s<<"\n";
    dfs(nr,0,0);
    sort(rez+1,rez+nr2+1);
    for(i=1;i<=nr2;i++)
    {
        fout<<rez[i].second.first<<" "<<rez[i].second.second<<"\n";
    }
}