Cod sursa(job #2199812)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 29 aprilie 2018 08:06:55
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

ifstream in ("huffman.in");
ofstream out ("huffman.out");

#define ll long long

int const nmax = 1000000;

struct Node{
  int pos;
  ll val;
};

queue < Node > q;
queue < Node > q2;

void qpop(){
  if(q.size() == 0)
    q2.pop();
  else if(q2.size() == 0)
    q.pop();
  else if(q.front().val < q2.front().val)
    q.pop();
  else
    q2.pop();
}

Node qfront(){
  if(q.size() == 0)
    return q2.front();
  else if(q2.size() == 0)
    return q.front();
  else if(q.front().val < q2.front().val)
    return q.front();
  else
    return q2.front();
}
int qsize(){
  return q.size() + q2.size();
}

ll dp[5 + 2 * nmax];
int level[5 + nmax];


int g[5 + 2 * nmax][2];

int lim ;
void computedp(int node){
  if(lim < node){
    for(int h = 0 ; h < 2 ;h++){
      dp[g[node][h]] = dp[node] * 2 + h;
      level[g[node][h]] = level[node] + 1;
      computedp(g[node][h]);
    }
  }
}
ll cost[5 + nmax];


int main()
{
  int n;
  in >> n;
  int lim = n;
  for(int i = 1 ; i <= n ;i++){
    int a;
    in >> a;
    q.push({i , a});
    cost[i] = a;
  }
  while(1 < qsize()){
    Node a = qfront();
    qpop();
    Node b = qfront();
    qpop();
    Node c = {++n , a.val + b.val};
    g[n][0] = a.pos;
    g[n][1] = b.pos;
    q2.push(c);
  }
  computedp(n);
  ll result = 0;
  for(int i = 1 ; i <= lim ;i++){
    result += level[i] * cost[i];
  }
  out << result << '\n';
  for(int i = 1 ; i <= lim ;i++){
    out << level[i] << " " << dp[i] << '\n';
  }

  return 0;
}