Cod sursa(job #2342947)

Utilizator catalin9898Bajenaru Catalin catalin9898 Data 13 februarie 2019 15:51:14
Problema Coduri Huffman Scor 45
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <cstdio>
using namespace std;

struct nod
{
    long long val;
    int poz;
    nod *l;
    nod *r;
}v[2000011];

nod  w[1011111];
int n;

void parc(nod r, int h, int val)
{

   // printf("%lld ", r.val);
    if(r.l == NULL)
    {
        w[r.poz].poz = h;
        w[r.poz].val = val;
        return;
    }
    parc(*r.l,h + 1, val<<1);
    parc(*r.r, h + 1, ((val<<1) + 1));
}
int main()
{
    freopen("huffman.in", "r", stdin);
    freopen("huffman.out", "w", stdout);
    int  i, s, f, sw = 0, fw = 0, ord, p1, p2;
    scanf("%d", &n);
    ord = n;
    s = n;
    f = 2*n;
    for(i = n; i < 2*n; i++)
        {v[i].poz = i + 1 - n;v[i].r = v[i].l = NULL;scanf("%lld", &(v[i].val));}
long long a, b, su = 0;
    while(s != f)
    {
        ord--;
        if(sw != fw)
        {
            if(v[s].val > w[sw].val)
                { v[ord].l = &w[sw]; a = w[sw++].val;}
            else
                { v[ord].l = &v[s];; a = v[s++].val;}

        }
        else
            { v[ord].l = &v[s];; a = v[s++].val;}

        if(sw != fw)
        {
            if(v[s].val > w[sw].val)
                {v[ord].r = &w[sw]; b = w[sw++].val;}
            else
                {v[ord].r = &v[s]; b = v[s++].val;}
        }
        else
            {v[ord].r = &v[s]; b = v[s++].val;}

        v[ord].val = a + b;
        su += a+b;
        w[fw++] = v[ord];
    }

    while(sw + 2 <= fw)
    {
        ord--;
        w[fw++].val = w[sw].val + w[sw+1].val;
        su += w[fw - 1].val;
        w[fw - 1].l = &w[sw];
        w[fw - 1].r = &w[sw+1];
        sw += 2;
        v[ord] = w[fw - 1];
    }

    parc(v[1],0, 0);
    printf("%lld\n", su);
    for(i = 1 ;i <= n;i ++)
    {
        printf("%d %lld\n", w[i].poz, w[i].val);
    }

    return 0;
}