Cod sursa(job #1994889)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 26 iunie 2017 15:02:50
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
queue <pair<long long,long long> > deCit;
queue <pair<long long,long long> > deLucrat;
int n,auxN;
int dist[2000003];
struct node
{
    int indiceTata;
    long long bit;
} PARENT[2000003];
void citire()
{
    long long aux;
    scanf("%d",&n);
    auxN=n;
    for(long long i=1; i<=n; i++)
    {
        scanf("%lld",&aux);
        deCit.push(make_pair(aux,i));
    }
}
pair<long long,long long> getMin()
{
    pair<long long,long long> rasp;
    if(deCit.empty())
    {
        rasp=deLucrat.front();
        deLucrat.pop();
        return rasp;
    }
    if(deLucrat.empty())
    {
        rasp=deCit.front();
        deCit.pop();
        return rasp;
    }
    if(deLucrat.front()<deCit.front())
    {
        rasp=deLucrat.front();
        deLucrat.pop();
        return rasp;
    }
    else
    {
        rasp=deCit.front();
        deCit.pop();
        return rasp;
    }
}
int main()
{
    long long rasp=0;
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);
    citire();
    pair <long long,long long> min1;
    pair <long long,long long> 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[(int)min1.second].indiceTata=PARENT[(int)min2.second].indiceTata=n;

        PARENT[(int)min1.second].bit=0;
        PARENT[(int)min2.second].bit=1;
    }
    printf("%lld\n",rasp);

    for(int i=n-1; i>=1; i--)
    {
        PARENT[i].bit|=(1LL*(PARENT[PARENT[i].indiceTata].bit<<1));
        dist[i]=1+dist[PARENT[i].indiceTata];
    }
    for(int i=1;i<=auxN;i++)
    {
        printf("%d %lld\n",dist[i],PARENT[i].bit);
    }
    return 0;
}