Cod sursa(job #2619394)

Utilizator maramihaliMara Mihali maramihali Data 27 mai 2020 16:34:05
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAX = 2000050;
long long fr[MAX], ln[MAX], b10[MAX], G[MAX][2];
queue <int> Q[3];

int Min()
{
    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, long long val, int len)
{
    if(G[nod][0] == 0)
    {
        ln[nod] = len;
		b10[nod] = val;
        return;
    }
    dfs(G[nod][0], val << 1LL, len + 1);
    dfs(G[nod][1], (val << 1LL) + 1, len + 1);
}

int main()
{
    int n;
	in >> n;
    for(int i = 1; i <= n; i++)
	{
        in >> fr[i];
		Q[1].push(i);
	}
	int nr = n;
	long long lg = 0;
    while((Q[1].size() + Q[2].size()) != 1)
    {
        int len = Min();
		int r = Min();
        Q[2].push(++nr);
        fr[nr] = fr[len] + fr[r];
        lg += fr[nr];
        G[nr][0] = len;
        G[nr][1] = r;
    }
    dfs(nr, 0, 0);
    out << lg << "\n";
    for(int i = 1; i <= n; i++)
        out << ln[i] << " " << b10[i] << "\n";
    return 0;
}