Cod sursa(job #2105781)

Utilizator patcasrarespatcas rares danut patcasrares Data 14 ianuarie 2018 11:07:37
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream>
#define DN 1000005
#define INF 100000000000005
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n,q[2][DN],k,l[2],r[2],poz,lg[DN];
long long mi,cod[DN],sol;
struct sdf
{
    long long v;
    int f[2];
}nod[2*DN];
void ve()
{
    k=n;
    r[0]=n;
    l[0]=l[1]=1;
    while(l[0]+l[1]<=r[0]+r[1])
    {
        k++;
        for(int i=0;i<2;i++)
        {
            mi=INF;
            for(int j=0;j<2;j++)
                if(l[j]<=r[j]&&nod[q[j][l[j]]].v<=mi)
                {
                    mi=nod[q[j][l[j]]].v;
                    poz=j;
                }
            nod[k].f[i]=q[poz][l[poz]];
            nod[k].v+=mi;
            l[poz]++;
        }
        r[1]++;
        q[1][r[1]]=k;
        sol+=nod[k].v;
    }
}
void dfs(int a,int nivel,long long val)
{
    if(nod[a].f[0])
    {
        dfs(nod[a].f[0],nivel+1,val*2);
        dfs(nod[a].f[1],nivel+1,val*2+1);
        return;
    }
    lg[a]=nivel;
    cod[a]=val;
}
int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>nod[i].v;
        q[0][i]=i;
    }
    ve();
    dfs(k,0,0);
    fout<<sol<<'\n';
    for(int i=1;i<=n;i++)
        fout<<lg[i]<<' '<<cod[i]<<'\n';
}