Cod sursa(job #2845453)

Utilizator Tudor06MusatTudor Tudor06 Data 7 februarie 2022 21:03:10
Problema Coduri Huffman Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;


priority_queue <pair<int, int>> pq;

const int NMAX = 1e6;

int father[2 * NMAX + 1];
int value[2 * NMAX + 1];
int v[NMAX + 1];

int x[2 * NMAX + 1];
int siz[NMAX + 1];
int j;

void b( int i ) {
    if ( i == j || siz[i] > 0 )
        return;
    b( father[i] );
    x[i] = 2 * x[father[i]] + value[i];
    siz[i] = siz[father[i]] + 1;
}
int main() {
    ifstream fin( "huffman.in" );
    ofstream fout( "huffman.out" );
    int n, i, a;
    fin >> n;
    for ( i = 0; i < n; i ++ ) {
        fin >> v[i];
        pq.push( { -v[i], i } );
    }
    j = n;
    while ( pq.size() > 1 ) {
        pair<int, int> x1 = pq.top();
        pq.pop();
        pair<int, int> x2 = pq.top();
        pq.pop();
        value[x1.second] = 0;
        value[x2.second] = 1;
        father[x1.second] = father[x2.second] = j;
        pq.push( { x1.first + x2.first, j } );
        j ++;
    }
    j --;
    long long lg = 0;
    vector <pair<long long, long long>> ans;
    for ( i = 0; i < n; i ++ ) {
        b(i);
        ans.push_back( {siz[i], x[i]} );
        lg += 1LL * siz[i] * v[i];
    }
    fout << lg << '\n';
    for ( auto it : ans ) {
        fout << it.first << ' ' << it.second << '\n';
    }
    return 0;
}