Cod sursa(job #3297497)

Utilizator Arhiva_EducationalaArhiva Educationala Arhiva_Educationala Data 22 mai 2025 18:41:07
Problema Coduri Huffman Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1e6;
const int VMAX = 2 * NMAX;

pair <int, int> edges[VMAX + 1];

long long cod[NMAX + 1];
int len[NMAX + 1];
int v[NMAX + 1];

void dfs( int node ) {
    if ( edges[node] == make_pair(0, 0) ) return;
    int l = edges[node].first, r = edges[node].second;
    len[l] = len[r] = len[node] + 1;
    cod[l] = cod[node] * 2;
    cod[r] = cod[node] * 2 + 1;

    dfs( l );
    dfs( r );
}
int main() {
    ifstream fin( "huffman.in" );
    ofstream fout( "huffman.out" );
    int n;
    fin >> n;
    priority_queue <pair<long long, int>> pq;

    for ( int i = 1; i <= n; i ++ ) {
        fin >> v[i];
        pq.push( {-v[i], i} );
    }
    int m = n;
    while ( pq.size() > 1 ) {
        auto p1 = pq.top();
        pq.pop();
        auto p2 = pq.top();
        pq.pop();
        edges[++m] = {p1.second, p2.second};
        pq.push( {p1.first + p2.first, m} );
    }
    dfs( m );
    long long totalLen = 0;
    for ( int i = 1; i <= n; i ++ ) {
        totalLen += (long long)v[i] * len[i];
    }
    fout << totalLen << '\n';
    for ( int i = 1; i <= n; i ++ ) {
        fout << len[i] << ' ' << cod[i] << '\n';
    }
    return 0;
}