Cod sursa(job #1081933)

Utilizator WyvernFMI Stanescu Leonard Wyvern Data 13 ianuarie 2014 23:05:44
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
using namespace std;
#define NMAX 1000100
typedef long long int64;
struct node{
    int64 val;
    int l,r;
}arb[NMAX<<1];
int64 code[NMAX<<1][2],size=0;
int n;
int64 dfs(int nod,int64 cod,int depth){
    if(arb[nod].l){
        return dfs(arb[nod].l,cod<<1,depth+1)+dfs(arb[nod].r,(cod<<1)+1,depth+1);
    }
    code[nod][0]=depth;
    code[nod][1]=cod;
    return arb[nod].val*depth;
}
int solve(){
    int p1=1,p2=n+1,len=n;
    while(p1 < n || p2 < len){
        arb[++len].val=0;
        if(p1<=n && (p2 >= len || arb[p1].val <= arb[p2].val)){
            arb[len].val += arb[p1].val;
            arb[len].l = p1,p1++;
        }else{
            arb[len].val += arb[p2].val;
            arb[len].l = p2,p2++;
        }
        if(p1<=n && (p2 >= len || arb[p1].val <= arb[p2].val)){
            arb[len].val += arb[p1].val;
            arb[len].r = p1,p1++;
        }else{
            arb[len].val += arb[p2].val;
            arb[len].r = p2,p2++;
        }
    }
    return len;
}
int main(){
    FILE* fin=fopen("huffman.in","r");
    FILE* fout=fopen("huffman.out","w");
    fscanf(fin,"%d ",&n);
    for(int i=1;i<=n;i++){
        fscanf(fin,"%lld ",&arb[i].val);
        arb[i].l=arb[i].r=0;
    }
    fprintf(fout,"%lld\n",dfs(solve(),0,0));
    for(int i=1;i<=n;i++){
        fprintf(fout,"%lld %lld\n",code[i][0],code[i][1]);
    }
    fclose(fin);
    fclose(fout);
}