Cod sursa(job #1464889)

Utilizator TeodorescuStefanEduardTeodorescu Stefan Eduard TeodorescuStefanEduard Data 25 iulie 2015 22:12:28
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<stdio.h>
using namespace std;
 
#define nmax 1000001
int d[2][nmax],st[2],f[2];
long long rez=0;
long long c[nmax],nv[nmax];
 
struct nod
{
    long long v;
    long l,r;
};
 
nod h[nmax*2];
int n;
FILE *in,*out;
 
void bf(int poz,long long put,int nivel)
{
    if(h[poz].l)
    {
        bf(h[poz].l,put*2,nivel+1);
        bf(h[poz].r,put*2+1,nivel+1);
        return;
    }
    c[poz]=put;
    nv[poz]=nivel;
}
 
void rezolva()
{
    int k=n;
 
    st[0]=1;st[1]=1;
    f[0]=n;f[1]=0;
    int c[2];
    int j;
    while(f[0]-st[0]>=0 || f[1]-st[1]>0)
    {
        int p=0;
        ++k;
        for(j=0;j<2;j++)
        {
            if(!(f[0]-st[0]>=0))
                p=1;
            else if(!(f[1]-st[1]>=0))
                p=0;
            else
                p=(d[0][st[0]]<d[1][st[1]]) ? 0 : 1;
 
 
            c[j]=st[p]+ n*p;
            st[p]++;
        }
        h[k].l=c[0];
        h[k].r=c[1];
        h[k].v=h[c[0]].v + h[c[1]].v;
        rez+=h[k].v;
 
        d[1][++f[1]]=h[k].v;
    }
    bf(k,0,0);
}
 
int main()
{
    in=fopen("huffman.in","r");
    out=fopen("huffman.out","w");
 
    fscanf(in,"%lld",&n);
     
    for(int i=1;i<=n;i++)
    {
         fscanf(in,"%d",&h[i].v);
        d[0][i]=h[i].v;
    }
    rezolva();
    fprintf(out,"%lld \n",rez);
    for(int i=1;i<=n;i++)
        fprintf(out,"%lld %lld \n",nv[i],c[i]);
    return 0;
}