Cod sursa(job #1193065)

Utilizator sebinechitasebi nechita sebinechita Data 30 mai 2014 19:55:46
Problema Coduri Huffman Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
#define MAX 1000100
struct node{
    long long val;
    int st, dr;
};

node *p;
node nod[2*MAX];
queue <int> Q1, Q2;
int n, i, x;

int take_min()
{
    int x;
    if(Q1.empty())
    {
        x=Q2.front();
        Q2.pop();
        return x;
    }
    if(Q2.empty())
    {
        x=Q1.front();
        Q1.pop();
        return x;
    }
    if(nod[Q2.front()].val<nod[Q1.front()].val)
    {
        x=Q2.front();
        Q2.pop();
        return x;
    }
    x=Q1.front();
    Q1.pop();
    return x;
}
long long nr;
int lg;
int ln[MAX];
long long number[MAX];
void df(int rad)
{
    if(!nod[rad].st)
    {
        ln[rad]=lg;
        number[rad]=nr;
        return;
    }
    lg++;
    nr*=2;
    df(nod[rad].st);
    nr++;
    df(nod[rad].dr);
    nr/=2;
    lg--;
}

int main()
{
    int d=0;
    fin>>n;
    for(i=1;i<=n;i++)
    {
        ++d;
        fin>>x;
        nod[d].val=x;
        Q1.push(d);
    }
    int i1, i2;
    long long s=0;
    for(i=1;i<n;i++)
    {
        i1=take_min();
        i2=take_min();
        d++;
        nod[d].val=nod[i1].val+nod[i2].val;
        nod[d].st=i1;
        nod[d].dr=i2;
        s+=nod[d].val;
        Q2.push(d);
    }
    int rad=d;
    fout<<s<<"\n";
    df(rad);
    for(i=1;i<=n;i++)
    {
        fout<<ln[i]<<" "<<number[i]<<"\n";
    }

}