Cod sursa(job #1193074)

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

node *p;
node nod[2*MAX];
int Q1[MAX], Q2[MAX], st1, dr1, st2, dr2;
int n, i, x;

int take_min()
{
    int x;
    if(st1>=dr1)
    {
        x=Q2[st2];
        st2++;
        return x;
    }
    if(st2>=dr2)
    {
        x=Q1[st1];
        st1++;
        return x;
    }
    if(nod[Q2[st2]].val<nod[Q1[st1]].val)
    {
        x=Q2[st2];
        st2++;
        return x;
    }
    x=Q1[st1];
    st1++;
    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[dr1++]=d;
    }
    fin.close();
    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[dr2++]=d;
    }
    df(d);

    fout<<s<<"\n";
    for(i=1;i<=n;i++)
    {
        fout<<ln[i]<<" "<<number[i]<<"\n";
    }
    fout.close();

}