Cod sursa(job #2281400)

Utilizator mircearoataMircea Roata Palade mircearoata Data 12 noiembrie 2018 10:34:25
Problema Coduri Huffman Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <queue>

using namespace std;

long long n, nrNod;
bool ok = 1;

long long fiust[2000001], fiudr[2000001], aparitii[2000001];
long long len[1000001], ans[1000001], x1, x2, sum;

void dfs(long long nod, long long val, long long l)
{
    if(nod <= n)
    {
        len[nod] = l;
        ans[nod] = val;
        return;
    }
    dfs(fiust[nod], (val << 1), l+1);
    dfs(fiudr[nod], (val << 1) + 1, l+1);
}

class Compare
{
public:
    bool operator() (long long l, long long r)
    {
        return aparitii[l] > aparitii[r];
    }
};

priority_queue <long long, vector<long long>, Compare> pq;

int main()
{
    FILE *in = fopen("huffman.in", "r");
    FILE *out = fopen("huffman.out", "w");
    fscanf(in, "%d", &n);
    nrNod = n;
    for(long long i = 1; i <= n; i++)
    {
        fscanf(in, "%d", &aparitii[i]);
        pq.push(i);
    }
    while(ok)
    {
        x1 = pq.top();
        pq.pop();
        if(pq.empty())
            ok = 0;
        else
        {
            x2 = pq.top();
            pq.pop();
            nrNod++;
            fiust[nrNod] = x1;
            fiudr[nrNod] = x2;
            aparitii[nrNod] = aparitii[x1]+aparitii[x2];
            pq.push(nrNod);
        }
    }
    dfs(nrNod, 0, 0);
    for(long long i = 1; i <= n; i++)
        sum += aparitii[i] * len[i];
    fprintf(out, "%lld\n", sum);
    for(long long i = 1; i <= n; i++)
        fprintf(out, "%lld %lld\n", len[i], ans[i]);
    return 0;
}