Cod sursa(job #1374362)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 5 martie 2015 08:34:31
Problema Coduri Huffman Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<cstdio>
#define INF (1LL<<62)-1
struct huff{
    long long a;
    long long v[2];
}v[2001000];
long long n,m,i,j,vmin,poz,s,x[2][1001000],y[1001000],z[1001000],u[2],p[2];
FILE *f,*g;
void dfs(int nod, int niv,long long val){
    if( v[nod].v[0] ){
        dfs( v[nod].v[0], niv+1, val*2 );
        dfs( v[nod].v[1], niv+1, val*2+1 );
        return;
    }
    y[nod]=niv;
    z[nod]=val;
}
int main(){
    f=fopen("huffman.in","r");
    g=fopen("huffman.out","w");
    fscanf(f,"%lld",&n);
    for(i=1;i<=n;i++){
        fscanf(f,"%lld",&v[i].a);
        x[0][i]=i;
    }
    p[0]=p[1]=1;
    m=u[0]=n;
    while(p[0]+p[1]<=u[0]+u[1]){
        m++;
        for(i=0;i<=1;i++){
            vmin=INF;
            for(j=0;j<=1;j++){
                if (p[j] <= u[j] && vmin > v[ x[j][ p[j] ] ].a ){
                    vmin = v[ x[j][ p[j] ] ].a;
                    poz=j;
                }
            }
            v[m].a+=vmin;
            v[m].v[i]=x[poz][ p[poz] ];
            p[poz]++;

        }
        s+=v[m].a;
        u[1]++;
        x[1][ u[1] ]=m;
    }
    fprintf(g,"%lld\n",s);
    dfs(m,0,0);
    for(i=1;i<=n;i++){
        fprintf(g,"%d ",y[i]);
        fprintf(g,"%lld\n",z[i]);
    }

    fclose(f);
    fclose(g);
    return 0;
}