Cod sursa(job #1483766)

Utilizator hrazvanHarsan Razvan hrazvan Data 9 septembrie 2015 21:38:22
Problema Coduri Huffman Scor 65
Compilator c Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#define MAXN 1000000
int nv[MAXN], nq[MAXN], sv, sq, dq, t[2 * MAXN], ad[2 * MAXN], sole[2 * MAXN], solnr[2 * MAXN];
int n;
long long v[MAXN], q[MAXN];

void dfs(int x, int *et, int *nr){
  if(x == 2 * n - 2){
    *et = 0;
    *nr = 0;
  }
  else  if(sole[x] != 0){
    *et = sole[x];
    *nr = solnr[x];
  }
  else{
    int et2, nr2;
    dfs(t[x], &et2, &nr2);
    *et = et2 * 2 + ad[x];
    sole[x] = *et;
    *nr = nr2 + 1;
    solnr[x] = *nr;
  }
}

inline void take(long long *x, int *p){
  if(sv == n){
    *x = q[sq];
    *p = nq[sq];
    sq++;
  }
  else  if(sq == dq){
    *x = v[sv];
    *p = nv[sv];
    sv++;
  }
  else{
    if(v[sv] > q[sq]){
      *x = q[sq];
      *p = nq[sq];
      sq++;
    }
    else{
      *x = v[sv];
      *p = nv[sv];
      sv++;
    }
  }
}

int main(){
  FILE *in = fopen("huffman.in", "r");
  int i;
  fscanf(in, "%d", &n);
  for(i = 0; i < n; i++){
    fscanf(in, "%lld", &v[i]);
    nv[i] = i;
  }
  fclose(in);
  long long sum = 0, x1, x2;
  int p1, p2;
  for(i = 0; i < n - 1; i++){
    take(&x1, &p1);
    take(&x2, &p2);
    q[dq] = x1 + x2;
    sum += q[dq];
    nq[dq] = n + i;
    t[p1] = t[p2] = nq[dq];
    ad[p1] = 0;
    ad[p2] = 1;
    dq++;
  }
  FILE *out = fopen("huffman.out", "w");
  fprintf(out, "%lld\n", sum);
  int poz;
  long long et, nr;
  for(i = 0; i < n; i++){
    poz = i;
    et = 0;
    nr = 0;
    dfs(i, &et, &nr);
    fprintf(out, "%lld %lld\n", nr, et);
  }
  fclose(out);
  return 0;
}