Cod sursa(job #1712879)

Utilizator drobertDumitru Robert drobert Data 3 iunie 2016 22:00:55
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <iostream>
#include <queue>
#include <limits>
using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");

#define NMAX 1000000
#define ll long long

int n, nodes, pos, qOrd, len[NMAX];
ll res, value, b[NMAX];
queue<int> q[2];
struct Node
{
    ll value;
    int posOfSon[2];
} v[NMAX * 2];

void dfs(int pos, ll code, int level)
{
    cout<<"ok";
    if (v[pos].posOfSon[0])
    {
        dfs(v[pos].posOfSon[0], code * 2, level + 1);
        dfs(v[pos].posOfSon[1], code * 2 + 1, level + 1);
        return;
    }
    b[pos] = code;
    len[pos] = level;
}

int main()
{
    f >> n;
    for (int i = 1;i <= n;i++)
    {
        f >> v[i].value;
        q[0].push(i);
    }

    nodes = n;
    while (q[0].size() + q[1].size() > 1)
    {
        nodes++;
        for (int j = 0;j < 2;j++)
        {
            value = numeric_limits<ll>::max();
            for (int i = 0;i < 2;i++)
                if (!q[i].empty() && value > v[q[i].front()].value)
                {
                    pos = q[i].front();
                    value = v[pos].value;
                    qOrd = i;
                }

            q[qOrd].pop();
            v[nodes].posOfSon[j] = pos;
            v[nodes].value += value;
        }

        q[1].push(nodes);
        res += v[nodes].value;
    }

    dfs(nodes, 0, 0);

    g << res << '\n';
    for (int i = 1;i <= n;i++)
        g << len[i] << " " << b[i]<<'\n';
}