Cod sursa(job #1866076)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 2 februarie 2017 16:54:22
Problema Coduri Huffman Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <utility>
#define nmax 1000100
#define inf 1LL*1e18

using namespace std;

struct nod {
    long long next[2], v;
}arb[2*nmax];
int n, i, j,s, k, lg[2*nmax];
long long cd[2*nmax];
long long sol;
vector <pair<long long, int> > heap;
pair<long long, int> pak;

void df(int poz, int cod, int niv) {
    if (arb[poz].next[0]) {
        df(arb[poz].next[0], 2*cod, niv+1);
        df(arb[poz].next[1], 2*cod+1, niv+1);
        return;
    }
    lg[poz]=niv;
    cd[poz]=cod;
    sol+= lg[poz]*arb[poz].v;
}

void calc() {
    k = n;
    make_heap(heap.begin(), heap.end());
    while (heap.size() > 1) {
        k++;
        for (i = 0; i < 2; i++) {
            pak = (*heap.begin());
            pop_heap(heap.begin(), heap.end());
            heap.pop_back();
            arb[k].next[i] = pak.second;
            arb[k].v += (-pak.first);
        }
        heap.push_back(make_pair(-arb[k].v, k));
        push_heap(heap.begin(), heap.end());
    }
    df(k,0,0);
}

int main() {
    FILE *f = fopen("huffman.in", "r");
    FILE *g = fopen("huffman.out", "w");
    fscanf(f,"%d\n",&n);
    for (i = 1; i <= n; i++) {
        fscanf(f,"%d\n",&arb[i].v);
        heap.push_back(make_pair(1LL*-arb[i].v,i));
    }
    calc();
    fprintf(g,"%d\n",sol);
    for (i = 1; i <= n; i++)
        fprintf(g,"%d %d\n",lg[i],cd[i]);
    return 0;
}