Cod sursa(job #2984213)

Utilizator verde.cristian2005Verde Flaviu-Cristian verde.cristian2005 Data 23 februarie 2023 18:51:42
Problema Coduri Huffman Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;

queue <int> q1, q2;
int v[2000001];
int st[2000001], dr[2000001];

int best()
{
    int x;
    if(!q1.size())
    {
        x = q2.front();
        q2.pop();
    }
    else if(!q2.size())
    {
        x = q1.front();
        q1.pop();
    }
    else if(v[q1.front()] < v[q2.front()])
    {
        x = q1.front();
        q1.pop();
    }
    else
    {
        x = q2.front();
        q2.pop();
    }
    return x;
}

int val[2000001], len[2000001];

void dfs(int nod)
{
    if(st[nod])
    {
        val[st[nod]] = val[nod] * 2;
        len[st[nod]] = len[nod] + 1;
        dfs(st[nod]);
    }
    if(dr[nod])
    {
        val[dr[nod]] = val[nod] * 2 + 1;
        len[dr[nod]] = len[nod] + 1;
        dfs(dr[nod]);
    }
}

int main()
{
    freopen("huffman.in", "r", stdin);
    freopen("huffman.out", "w", stdout);
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> v[i];
        q1.push(i);
    }
    while(q1.size() + q2.size() > 1)
    {
        int p1, p2;
        p1 = best();
        p2 = best();
        v[++n] = v[p1] + v[p2];
        st[n] = p1;
        dr[n] = p2;
        q2.push(n);
    }
    dfs(n);
    int rez = 0;
    for(int i = (n + 1) / 2 + 1; i <= n; i++)
        rez += v[i];
    cout << rez << '\n';
    for(int i = 1; i <= (n + 1) / 2; i++)
        cout << len[i] << " " << val[i] << '\n';
    return 0;
}