Cod sursa(job #2059948)

Utilizator claudiuarseneClaudiu Arsene claudiuarsene Data 7 noiembrie 2017 19:16:32
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<stdio.h>
#define NMAX 1000100
#define INF 1LL * 1000000000 * 2000000000
int N,lg[NMAX],cc[NMAX],fs[2*NMAX],fd[2*NMAX],NC;
long long val[2*NMAX],cod[NMAX],S;
void df(int pp,int h,long long cd){
    if(pp<=N){
        lg[pp]=h;
        cod[pp]=cd;
        return;
    }
    df(fs[pp],h+1,cd<<1);
    df(fd[pp],h+1,(cd<<1)+1);
}
int main(){
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);
    int i,p,u,a,b,c,vv;
    scanf("%d",&N);
    for(i=1;i<=N;++i){
        scanf("%d",&vv);
        val[i]=(long long)vv;
    }
    for(;i<=(N<<1)+2;++i)
        val[i]=INF;
    val[0]=INF;
    i=N+1;
    c=1;
    u=0;
    p=1;
    while(1){
        if(val[c]<val[cc[p]]){
            a=c++;
            if(val[c]<val[cc[p]])
                b=c++;
            else
                b=cc[p++];
        }
        else{
            a=cc[p++];
            if(val[c]<val[cc[p]])
                b=c++;
            else
                b=cc[p++];
        }
        if(val[a]==INF || val[b]==INF)
            break;
        val[++i]=val[a]+val[b];
        S+=val[i];
        fs[i]=a;
        fd[i]=b;
        cc[++u]=i;
    }

    df(i,0,0);
    printf("%lld\n",S);
    for(i=1;i<=N;++i)
        printf("%d %lld\n",lg[i],cod[i]);

    fclose(stdin);
    fclose(stdout);
    return 0;
}