Cod sursa(job #1759511)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 19 septembrie 2016 13:06:49
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<stdio.h>
using namespace std;
FILE *f1=fopen("huffman.in","r");
FILE *f2=fopen("huffman.out","w");
int n,l[2],r[2],i,q[2][1000001];
long long b[1000001],lg[1000001],sol,Min,inf=1000000000000000;
struct nod{
    long long v;
    int f[2];
}arb[2000002];
void dfs(int poz,long long cod,long long nivel){
      if (arb[poz].f[0]){
        dfs(arb[poz].f[0],cod*2,nivel+1);
        dfs(arb[poz].f[1],cod*2+1,nivel+1);
        return;
      }
      lg[poz]=nivel;
      b[poz]=cod;
}
void rezolva(){
     int p,i,j,k;
     k=n;
     l[0]=l[1]=1;
     r[0]=n;
     while(l[0]+l[1]<=r[0]+r[1]){
        k++;
        for (j=0;j<2;j++){
            p=0;
            Min=inf;
            for (i=0;i<2;i++)
              if (Min>arb[q[i][l[i]]].v && l[i]<=r[i]){
                     Min=arb[q[i][l[i]]].v;
                     p=i;
              }
             arb[k].f[j]=q[p][l[p]];
             arb[k].v+=arb[q[p][l[p]]].v;
             l[p]++;
        }
        sol+=arb[k].v;
        r[1]++;
        q[1][r[1]]=k;
     }
     dfs(k,0,0);
}
int main(){
    fscanf(f1,"%d",&n);
    for (i=1;i<=n;i++){
        fscanf(f1,"%lld",&arb[i].v);
        q[0][i]=i;
    }
    fclose(f1);
    rezolva();
    fprintf(f2,"%lld\n",sol);
    for (i=1;i<=n;i++)
        fprintf(f2,"%lld %lld\n",lg[i],b[i]);
    fclose(f2);
    return 0;
}