Cod sursa(job #1264059)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 15 noiembrie 2014 14:54:31
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <fstream>

#define NMAX 1000005
#define lint long long int
using namespace std;

struct nod{
    int fiu_st,fiu_dr,ans1;
    lint frecv;

    lint ans2;

    nod(int fiu_st=0, int fiu_dr=0,int ans1=0, lint frecv=0,  lint ans2=0): fiu_st(fiu_st), fiu_dr(fiu_dr), ans1(ans1), frecv(frecv), ans2(ans2) {}
}nodes[2*NMAX];

int depth;
lint cod;

void dfs(int nod){
    nodes[nod].ans1=depth;
    nodes[nod].ans2=cod;

    cod<<=1;
    depth++;

    if(nodes[nod].fiu_st)
        dfs(nodes[nod].fiu_st);
    if(nodes[nod].fiu_dr){
        cod++;
        dfs(nodes[nod].fiu_dr);
        cod--;
    }

    depth--;
    cod>>=1;
}

int coada1[NMAX],coada2[NMAX];

int main()
{
    ifstream cin("huffman.in");
    ofstream cout("huffman.out");

    int n=0,i;
    cin>>n;

    int poz=0;
    int st1=1,dr1=n,st2=1,dr2=0;

    for(i=1;i<=n;i++){
        cin>>nodes[++poz].frecv;
        coada1[i]=i;
    }

    lint ans=0;
    int n1,n2;

    while(dr1-st1+dr2-st2+1){
        if(st1<=dr1 && st2<=dr2){
            if(nodes[coada1[st1]].frecv<nodes[coada2[st2]].frecv)
                n1=coada1[st1++];
            else
                n1=coada2[st2++];
        }
        else if(st1<=dr1)
            n1=coada1[st1++];
        else
            n1=coada2[st2++];

        if(st1<=dr1 && st2<=dr2){
            if(nodes[coada1[st1]].frecv<nodes[coada2[st2]].frecv)
                n2=coada1[st1++];
            else
                n2=coada2[st2++];
        }
        else if(st1<=dr1)
            n2=coada1[st1++];
        else
            n2=coada2[st2++];

        nodes[++poz].fiu_st=n1;
        nodes[poz].fiu_dr=n2;
        nodes[poz].frecv=nodes[n1].frecv+nodes[n2].frecv;

        ans+=nodes[poz].frecv;

        coada2[++dr2]=poz;
    }

    cout<<ans<<'\n';
    //dfs(2*n-1,0,0);
    cod=0;
    depth=0;

    dfs(2*n-1);

    for(i=1;i<=n;i++)
        cout<<nodes[i].ans1<<' '<<nodes[i].ans2<<'\n';

    cin.close();
    cout.close();
    return 0;
}