Cod sursa(job #3262640)

Utilizator raileanu-alin-gabrielRaileanu Alin-Gabriel raileanu-alin-gabriel Data 11 decembrie 2024 00:53:54
Problema Coduri Huffman Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <set>
#define f first
#define s second

using namespace std;
ifstream cin("huffman.in");
ofstream cout("huffman.out");

const int NMAX=1e6+5;

pair<int, int> ans[NMAX];
int n;
long long sum;

struct arb
{
  int et;
  long long val;
  arb *l, *r;

  arb(int i, int nr)
  {
    et=i;
    val=nr;
    l=r=NULL;
  }

  arb(arb *p1, arb *p2)
  {
    et=0;
    val=p1->val+p2->val;
    l=p1; r=p2;
  }
} *root;

set <pair<long long, arb*>> s;

void dfs(arb* node, int lvl, int code)
{
  if(node->et)
  {
    ans[node->et]={lvl, code};
    sum+=lvl*node->val;
    return;
  }
  dfs(node->l, lvl+1, 2*code);
  dfs(node->r, lvl+1, 2*code+1);
}

signed main()
{
  int i, val;
  cin>>n;
  for(i=1; i<=n; i++)
  {
    cin>>val;
    arb *nod=new arb(i, val);
    s.insert({val, nod});
  }
  arb *p1, *p2;
  while(!s.empty())
  {
    p1=(*s.begin()).s; s.erase(s.begin());
    if(s.empty())
    {
      root=p1;
      break;
    }
    p2=(*s.begin()).s; s.erase(s.begin());
    arb *p3=new arb(p1, p2);
    s.insert({p3->val, p3});
  }
  dfs(root, 0, 0);
  cout<<sum<<'\n';
  for(i=1; i<=n; i++) cout<<ans[i].f<<' '<<ans[i].s<<'\n';
}