Cod sursa(job #2925556)

Utilizator dr_personalityEftime Andrei Horatiu dr_personality Data 15 octombrie 2022 17:48:45
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>
#include<queue>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");

struct tree{
    int son1, son2;
    long long weight;
};

struct cod{
    int lung;
    long long cod;
};

const int nmax = 1000006;
long long lg;
int n, startv, new_nod, mini[2];
queue<int> coada;
tree arbore[4* nmax];
cod vans[nmax];

void find_ans(long long cod, int lung, int ind)
{
    if(ind<=n)
    {
        vans[ind].cod = cod;
        vans[ind].lung = lung;
        return;
    }

    find_ans(cod * 2, lung + 1, arbore[ind].son1);
    find_ans(cod * 2 + 1, lung + 1, arbore[ind].son2);
}

int main()
{
    in>>n;
    for(int i = 1; i<=n; i++)
    {
        in>>arbore[i].weight;
        arbore[i].son1 = arbore[i].son2 = -1;
    }

    startv = 1, new_nod = n + 1;
    while(startv<=n || (int)coada.size()>1)
    {
        for(int i = 0 ;i<2; i++)
        {
            if(startv<=n && ((int)coada.empty()==1 || arbore[startv].weight<=arbore[(int)coada.front()].weight))
            {
                mini[i] = startv;
                startv++;
                continue;
            }
            if((int)coada.empty()==0 && (startv>n || arbore[startv].weight>=arbore[(int)coada.front()].weight))
            {
                mini[i] = (int)coada.front();
                coada.pop();
            }
        }

        arbore[new_nod].son1 = mini[0];
        arbore[new_nod].son2 = mini[1];
        arbore[new_nod].weight = arbore[mini[0]].weight + arbore[mini[1]].weight;
        coada.push(new_nod);

        new_nod++;
    }

/*for(int i = 1; i<new_nod; i++)
    {
        out<<i<<' '<<arbore[i].son1<<' '<<arbore[i].son2<<' '<<arbore[i].weight<<'\n';
    }*/

    find_ans(0, 0, new_nod - 1);

    for(int i = 1; i<=n; i++)
    {
        lg += vans[i].lung * arbore[i].weight;
    }

    out<<lg<<'\n';

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

    return 0;
}