Cod sursa(job #1992850)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 21 iunie 2017 16:44:59
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
queue <pair<int,int> > deCit;
queue <pair<int,int> > deLucrat;
int n,auxN;
struct node
{
    int indiceTata;
    int bit;
}PARENT[2000003];
void citire()
{
    int aux;
    scanf("%d",&n);
    auxN=n;
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&aux);
        deCit.push(make_pair(aux,i));
    }
}
pair<int,int> getMin()
{
    pair<int,int> rasp;
    if(!deCit.empty())
    {
        if(!deLucrat.empty())
        {
            if(deCit.front().first<=deLucrat.front().first)
            {
                rasp=deCit.front();
                deCit.pop();
                return rasp;
            }
            else
            {
                rasp=deLucrat.front();
                deLucrat.pop();
                return rasp;
            }
        }
        else
        {
            rasp=deCit.front();
            deCit.pop();
            return rasp;
        }
    }
    else if(!deLucrat.empty())
    {
        rasp=deLucrat.front();
        deLucrat.pop();
        return rasp;
    }
}
int main()
{
    long long rasp=0;
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdin);
    citire();
    pair <int,int> min1;
    pair <int,int> min2;
    while(deCit.size()+deLucrat.size()>1)
    {
        min1=getMin();
        min2=getMin();

        deLucrat.push(make_pair(min1.first+min2.first,++n));
        rasp+=min1.first+min2.first;

        PARENT[min1.second].indiceTata=PARENT[min2.second].indiceTata=n;

        PARENT[min1.second].bit=0;
        PARENT[min2.second].bit=1;
    }
    printf("%lld\n",rasp);
    for(int i=1;i<=auxN;i++)
    {
        int poz=i;
        int nrCod=0;
        int p=0;
        while(poz!=n)
        {
            nrCod+=PARENT[poz].bit<<p;
            poz=PARENT[poz].indiceTata;
            p++;
        }
        printf("%d %d\n",p,nrCod);
    }
    return 0;
}