Cod sursa(job #2517941)

Utilizator Rares31100Popa Rares Rares31100 Data 4 ianuarie 2020 15:38:55
Problema Coduri Huffman Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
#define PII pair<int,int>
#define PLI pair<long long,int>
#define LL long long
#define Val first
#define Poz second

using namespace std;

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

int n;
LL val[2000001];
PII decInit[1000001];
PLI decComp[1000001];
int vf,st1=1,dr1,st2=1,dr2;
PII fii[1000001];
int tata[2000001];
unsigned LL sum;
LL cod[1000001];
int lung[1000001];
int pasi[1000001];

PLI atrib()
{
    if(st2>dr2)
        return decInit[st1++];
    else if(st1>dr1)
        return decComp[st2++];
    else if(decInit[st1].Val<decComp[st2].Val)
        return decInit[st1++];
    else
        return decComp[st2++];
}

int main()
{
    in>>n;
    vf=n;

    for(int i=1;i<=n;i++)
    {
        in>>val[i];
        decInit[++dr1]={val[i],i};
    }

    PLI nod1,nod2;
    while(st1<=dr1 || st2<=dr2)
    {
        nod1=atrib();
        nod2=atrib();

        val[++vf]=nod1.Val+nod2.Val;
        fii[vf]={nod1.Poz,nod2.Poz};
        tata[nod1.Poz]=vf;
        tata[nod2.Poz]=vf;

        if(st1<=dr1 || st2<=dr2)
            decComp[++dr2]={val[vf],vf};
    }

    for(int i=1;i<=n;i++)
    {
        int poz=i;
        pasi[0]=i;

        while(tata[poz])
        {
            pasi[++lung[i]]=tata[poz];
            poz=tata[poz];
        }

        for(int j=lung[i];j;j--)
            if(fii[ pasi[j] ].first==pasi[j-1])
                cod[i]=cod[i]*2;
            else
                cod[i]=cod[i]*2+1;

        sum+=val[i]*lung[i];
    }

    out<<sum<<'\n';

    for(int i=1;i<=n;i++)
        out<<lung[i]<<' '<<cod[i]<<'\n';

    return 0;
}