Cod sursa(job #3333446)

Utilizator rares89_Dumitriu Rares rares89_ Data 13 ianuarie 2026 16:44:51
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream cin("huffman.in");
ofstream cout("huffman.out");

const int NMAX = 1000005;

long long v[2 * NMAX];
int l[2 * NMAX], r[2 * NMAX];
int len[NMAX];
unsigned long long code[NMAX];
int n;

void dfs(int node, int currLen, unsigned long long currCode) {
    if (node < n) {
        len[node] = currLen;
        code[node] = currCode;
        return;
    }
    dfs(l[node], currLen + 1, currCode << 1);
    dfs(r[node], currLen + 1, (currCode << 1) | 1);
}

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> v[i];
    }

    int p1 = 0, p2 = n;
    long long ans = 0;

    for (int i = 0; i < n - 1; ++i) {
        int x, y;

        if (p1 < n && (p2 == n + i || v[p1] <= v[p2])) {
            x = p1++;
        } else {
            x = p2++;
        }

        if (p1 < n && (p2 == n + i || v[p1] <= v[p2])) {
            y = p1++;
        } else {
            y = p2++;
        }

        int newNode = n + i;
        v[newNode] = v[x] + v[y];
        l[newNode] = x;
        r[newNode] = y;
        ans += v[newNode];
    }

    cout << ans << '\n';

    dfs(2 * n - 2, 0, 0);

    for (int i = 0; i < n; ++i) {
        cout << len[i] << " " << code[i] << '\n';
    }

    return 0;
}