Cod sursa(job #2734538)

Utilizator FischerMiguel Mini Fischer Data 1 aprilie 2021 07:25:20
Problema Coduri Huffman Scor 65
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
using namespace std;

const int maxn = 2e6 + 10;
int H[maxn][2];
int e = 1;
long long val[maxn];
int dist[maxn];
int w[maxn>>1];

vector<pair<int, long long>> res;
void bfs(int src) {
    val[src] = dist[src] = 0;
    queue<int> Q;
    Q.emplace(src);
    while (!Q.empty()) {
        int q = Q.front(); Q.pop();
        for (int i = 0; i < 2; ++i) {
            if (!H[q][i]) continue;
            dist[H[q][i]] = dist[q] + 1;
            val[H[q][i]] = val[q] * 2 + i;
            Q.emplace(H[q][i]);
        }
    }
}

int main() {
    freopen("huffman.in", "r", stdin);
    freopen("huffman.out", "w", stdout);
    int n;
    scanf("%d", &n);
    using ii = pair<long long, int>;
    priority_queue<ii> pq;
    for (int i = 1; i <= n; ++i) {
        scanf("%d", w+i);
        pq.emplace(-w[i], e++);
    }
    while (pq.size() > 1) {
        auto a = pq.top(); pq.pop();
        auto b = pq.top(); pq.pop();
        H[e][0] = a.second;
        H[e][1] = b.second;
        pq.emplace(a.first + b.first, e++);
    }
    int root = pq.top().second;
    bfs(root);
    long long ans = 0;
    for (int i = 1; i <= n; ++i) ans += dist[i] *1ll * w[i];
    printf("%lld\n", ans);
    for (int i = 1; i <= n; ++i) {
        printf("%d %lld\n", dist[i], val[i]);
    }
    return 0;
}