Cod sursa(job #2906753)

Utilizator agabi21Totolici Alexandru agabi21 Data 27 mai 2022 11:50:06
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("huffman.in");
ofstream g("huffman.out");

const int CMAX = 2e6+15;;

int n;
long long temp;
struct noduri{
    int st, dr , niv;
    long long val;
}heap[CMAX];

void read(){
    f >> n;
    for(int i=1;i<=n;i++)
        f >> heap[i].val;
}

void parcurgere_srd(int nod,int niv, long long val){
    if(nod>0){
        heap[nod].val = val;
        heap[nod].niv = niv;
        parcurgere_srd(heap[nod].st,niv+1,val*2);
        parcurgere_srd(heap[nod].dr,niv+1,(val*2)+1);
    }
}

void huffman(){
    heap[n+1].val = LONG_LONG_MAX;
    int i, j, stop , st , dr;
    i = 1;
    j = n+2;
    stop = n+1;
    while(i < n+1 || j < stop){
        if(j <= stop && heap[j].val < heap[i].val)
            st = j++;
        else{
            st = i++;
        }
        if(j <= stop && heap[j].val < heap[i].val){
            dr = j++;
        }
        else
        {
            dr = i++;
        }
        heap[++stop].val = heap[st].val + heap[dr].val;
        heap[stop].st = st;
        heap[stop].dr = dr;
        temp = temp + heap[stop].val;
    }
    parcurgere_srd(stop,0,0);
}

int main()
{
    read();
    huffman();
    g << temp << '\n';
    for(int i=1;i<=n;i++)
        g << heap[i].niv << " " << heap[i].val << '\n';
    return 0;
}