Cod sursa(job #2290155)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 25 noiembrie 2018 20:42:51
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>


typedef int T;


const long long WMAX = 1LL * 1000000000 * 1000000000;
const T NMAX = 1000005;

T N;

T q[2][NMAX];
T  l[2], r[2]; // capete cozi
T  lev[NMAX];
long long code[NMAX];

struct nod {
   long long val;
   T child[2];
};

nod nodes[NMAX*2];

void dfs(T poz_nod, T level, long long cod) {
   if (nodes[poz_nod].child[0]) {
      dfs(nodes[poz_nod].child[0], level+1, cod*2);
      dfs(nodes[poz_nod].child[1], level+1, cod*2+1);
      return;
   }
   lev[poz_nod] = level;
   code[poz_nod] = cod;
}

long long huffman() {
   long k = N;
   l[0] = l[1] = 1;
   r[1] = 0;
   r[0] = N;

   long long sol = 0;
   while (l[0] < r[0] || l[1] < r[1]) {
      ++k;

      for (int i = 0; i < 2; ++i) {
         long long mnod_val = WMAX;
         int q_ix = -1;

         for (int j = 0; j < 2; ++j) {
            if (l[j] <= r[j] && nodes[q[j][l[j]]].val < mnod_val) {
               mnod_val = nodes[q[j][l[j]]].val;
               q_ix = j;
            }
         }

         nodes[k].child[i] = q[q_ix][l[q_ix]];
         nodes[k].val += mnod_val;
         l[q_ix] += 1;
      }
      q[1][++r[1]] = k;
      sol += nodes[k].val;
   }
   dfs(k,0,0);
   return sol;
}

int main() {
   freopen("huffman.in", "r", stdin);
   freopen("huffman.out", "w", stdout);

   scanf("%d", &N);

   for (T i = 1; i <= N; ++i) {
      scanf("%lld", &nodes[i].val);
      q[0][i] = i;
   }

   long long sol = huffman();
   printf("%lld\n", sol);

   for (int i = 1; i <= N; ++i) {
      printf("%d %lld\n", lev[i], code[i]);
   }


   fclose(stdin);
   fclose(stdout);
}