Cod sursa(job #1501151)

Utilizator SzymonSidorSzymonSidor SzymonSidor Data 13 octombrie 2015 00:25:32
Problema Coduri Huffman Scor 85
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <algorithm>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <vector>

#define MAX_N 1000010
#define pb push_back

using namespace std;
    
int n, nl;
long long weightQueue[2 * MAX_N];
pair <int, int> parents[2 * MAX_N];
long long sol[2 * MAX_N];
int level[2 * MAX_N];

int takeMin(int initQ, int newQ) {
    if (initQ >= n)
        return newQ;
    if (newQ >= nl)
        return initQ;
    if (weightQueue[initQ] < weightQueue[newQ])
        return initQ;
    return newQ;
}

int main() {
    ifstream cin("huffman.in");
    freopen("huffman.out", "w", stdout);

    cin >> n;
    nl = n;
    for (int i = 0, x; i < n; i++) {
        cin >> x;
        weightQueue[i] = x;
    }

    for (int iter = n - 1, firstQ = n, firstEl = 0; iter; iter--, nl++) {
        int p1 = takeMin(firstEl, firstQ);
        if (p1 == firstEl)
            firstEl++;
        else firstQ++;
        int p2 = takeMin(firstEl, firstQ);
        if (p2 == firstEl)
            firstEl++;
        else firstQ++;
        weightQueue[nl] = weightQueue[p1] + weightQueue[p2];
        parents[nl] = make_pair(p1, p2);
    }
    
    for (int i = nl - 1; i >= n; i--) {
        sol[parents[i].first] = sol[i] * 2 + 1;
        sol[parents[i].second] = sol[i] * 2;
        level[parents[i].first] = level[parents[i].second] = level[i] + 1;
    }

    long long minSol = 0;
    for (int i = 0; i < n; i++)
        minSol += weightQueue[i] * level[i];
    printf("%lld\n", minSol);
    for (int i = 0; i < n; i++)
        printf("%d %lld\n", level[i], sol[i]);

    return 0;
}