Cod sursa(job #2627765)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 12 iunie 2020 14:07:25
Problema Coduri Huffman Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

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

typedef long long ll;

const int nmax = 2e6 + 3;

ll fr[nmax], ln[nmax], sol[nmax], v[nmax][2];

queue <int> q[3];

int solve()
{
    int x;

    if(q[1].empty())
    {
        x = q[2].front();

        q[2].pop();

        return x;
    }

    if(q[2].empty())
    {
        x = q[1].front();

        q[1].pop();

        return x;
    }

    if(fr[q[1].front()] <= fr[q[2].front()])
    {
        x = q[1].front();

        q[1].pop();

        return x;
    }

    x = q[2].front();

    q[2].pop();

    return x;
}

void dfs(int nod, ll val, int len)
{
    if(!v[nod][0])
    {
        ln[nod] = len;

		sol[nod] = val;

        return;
    }

    dfs(v[nod][0], 2ll * val, len + 1);

    dfs(v[nod][1], 2ll * val + 1, len + 1);
}

int main()
{
    int n;

	f >> n;

    for(int i = 1; i <= n; ++i)
	{
        f >> fr[i];

		q[1].push(i);
	}

	int nr = n;

	ll lg = 0;

    while((q[1].size() + q[2].size()) != 1)
    {
        int len = solve();

		int r = solve();

        q[2].push(++nr);

        fr[nr] = fr[len] + fr[r];

        lg += fr[nr];

        v[nr][0] = len;

        v[nr][1] = r;
    }

    dfs(nr, 0, 0);

    g << lg << '\n';

    for(int i = 1; i <= n; ++i) g << ln[i] << ' ' << sol[i] << '\n';

    return 0;
}