Cod sursa(job #2734537)

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

const int maxn = 2e6 + 10;
struct Node {
    int id;
    long long sum;
    int l, r;
    bool operator<(Node q) const {
        return -sum < -q.sum;   
    }
} H[maxn];
int e = 1;
long long val[maxn];
int dist[maxn];

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

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