Cod sursa(job #2206933)

Utilizator bt.panteaPantea Beniamin bt.pantea Data 24 mai 2018 15:53:32
Problema Coduri Huffman Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <string>
#define NMAX 1000005

using namespace std;

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

priority_queue< pair < long long, long long > > Q;

struct Node 
{
    long long value;
    long long next[2];
}node[2*NMAX];

long long n, k, root, level[2 * NMAX];
long long lg;
long long cod[2 * NMAX];

void calcLevel(long long k, long long nivel, long long c)
{
    level[k] = nivel;
    cod[k] = c;
    if (node[k].next[0] != 0)
    {
        calcLevel(node[k].next[0], nivel + 1, 2 * c);
        calcLevel(node[k].next[1], nivel + 1, 2 * c + 1);
    }
}

void solve()
{
    k = n;

    while (Q.size() >= 2)
    {
        pair < long long, long long > x1, x2;
        x1 = Q.top();
        Q.pop();
        x2 = Q.top();
        Q.pop();
        long long i = x1.second, j = x2.second;
        k++;
        node[k].value = - x1.first - x2.first;
        node[k].next[0] = i;
        node[k].next[1] = j;
        Q.push({-node[k].value, k});
    }
    root = Q.top().second; // root = 2 * n - 1;
}

void read()
{
    f >> n;
    for (long long i = 1; i <= n; i++)
    {
        f >> node[i].value;
        node[i].next[0] = node[i].next[1] = 0;
        Q.push({-node[i].value, i});
    }
}

int main()
{
    read();
    solve();
    calcLevel(root, 0, 0);

    long long sum = 0;
    for (long long i = 1; i <= n; i++)
        sum += node[i].value * level[i];
    g << sum <<'\n';

    for (long long i = 1; i <= n; i++)
        g << level[i] << ' ' << cod[i] << '\n';
    return 0;
}