Cod sursa(job #2535403)

Utilizator GeorgeCalinPetruta George-Calin GeorgeCalin Data 31 ianuarie 2020 20:30:20
Problema Coduri Huffman Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <climits>
#define nmax 1000002
#define uss unsigned long long
using namespace std;

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

struct tata{
    char c;
    int val;
};
struct muchie {
    tata x;
    uss val;
}sir2[2 * nmax];

uss s;
uss sir1[nmax];
int n, k = 0, l = 1, c = 1;

struct mem{
    int bit;
    uss val;
}sir[nmax];

uss sum = 0;

int main()
{
    fin>>n;
    c = n + 1;
    k = n;
    for(int i = 1; i <= n; ++i)
        fin>>sir1[i];
    for(int i = 1; i < n; ++i)
    {
        if((sir1[l] < sir2[c].val || c > k) && l <= n)
        {
            sir2[++k].val = sir1[l];
            sir2[l].x.val = k;
            l++;
        }
        else
        {
            sir2[++k].val = sir2[c].val;
            sir2[c].x.val = k;
            c++;
        }
        if((sir1[l] < sir2[c].val || c > k - 1) && l <= n)
        {
            sir2[k].val += sir1[l];
            sir2[l].x.val = k;
            sir2[l].x.c = 'd';
            l++;
        }
        else
        {
            sir2[k].val += sir2[c].val;
            sir2[c].x.val = k;
            sir2[c].x.c = 'd';
            c++;
        }
        sum += sir2[k].val;
    }
    for(int i = 1; i <= n; ++i)
    {
        int nod = i;
        long long s = 1;
        int l = 0;
        while(nod != k)
        {
            sir[i].bit++;
            if(sir2[nod].x.c == 'd')
                sir[i].val += s;
            nod = sir2[nod].x.val;
            s*=2;
        }
    }
    fout<<sum<<"\n";
    for(int i = 1; i <= n; ++i)
    {
        fout<<sir[i].bit<<" "<<sir[i].val<<"\n";
    }
    return 0;
}