Cod sursa(job #2899037)

Utilizator alexdumitrescuDumitrescu George Alex alexdumitrescu Data 7 mai 2022 16:18:47
Problema Coduri Huffman Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>
#define ll long long
#define Nmax 2000005
#define fr first
#define sc second
#define pii pair<int, int>

using namespace std;

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

int n, ap[Nmax];
ll sum;
queue <int> q1, q2;
vector <pii> v[Nmax];
vector <int> cod[Nmax];

int extrage()
{
    int u;
    if(q1.size()&&q2.size())
    {
        if(ap[q1.front()]<ap[q2.front()])
        {
            u=q1.front();
            q1.pop();
        }
        else
        {
            u=q2.front();
            q2.pop();
        }
    }
    else if(q1.size()){
        u=q1.front();
        q1.pop();
    }
    else{
        u=q2.front();
        q2.pop();
    }
    return u;
}
void dfs(int x)
{
    for(auto it:v[x])
    {
        cod[it.fr].push_back(it.sc);
        for(auto aux:cod[x])
            cod[it.fr].push_back(aux);
        dfs(it.fr);
    }
}
int main()
{
    fin >> n;
    for(int i=1;i<=n;i++)
    {
        fin >> ap[i];
        q1.push(i);
    }

    for(int nod=n+1;nod<2*n;nod++)
    {
        int u1=extrage();
        int u2=extrage();

        ap[nod]=ap[u1]+ap[u2];
        v[nod].push_back({u1, 1});
        v[nod].push_back({u2, 0});
        q2.push(nod);
    }
    dfs(n*2-1);
    for(int i=1;i<=n;i++)
    {
        sum=sum+ap[i]*cod[i].size();
    }
    fout << sum << '\n';
    for(int i=1;i<=n;i++)
    {
        fout << cod[i].size() << ' ';
        ll value=0;
        for(int j=0;j<cod[i].size();j++)
            value = value + (1LL<<j)*cod[i][j];

        fout << value << '\n';
    }
    return 0;
}