Cod sursa(job #2845487)

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

using namespace std;

const int NMAX = 1e6;

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

long long x[2 * NMAX + 1];
int siz[2 * 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;
}
queue <pair<long long, int>> q;

int st, dr;

pair<long long, int> minim() {
    pair<long long, int> a;
    if ( st == dr ) {
        a = q.front();
        q.pop();
    } else if ( q.size() == 0 ) {
        a = { x[st], siz[st] };
        st ++;
    } else {
        if ( x[st] < q.front().first ) {
            a = { x[st], siz[st] };
            st ++;
        } else {
            a = q.front();
            q.pop();
        }
    }
    return a;
}
int main() {
    ifstream fin( "huffman.in" );
    ofstream fout( "huffman.out" );
    int n, i;
    fin >> n;
    for ( i = 0; i < n; i ++ ) {
        fin >> v[i];
        q.push( { v[i], i } );
    }
    j = n;
    i = 0;
    while ( q.size() + (dr - st) > 1 ) {
        while ( ( i == 0 && q.size() > 0 ) || ( i == 1 && dr > st ) ) {
            pair<long long, int> a = minim();
            pair<long long, int> b = minim();
            father[a.second] = father[b.second] = j;
            value[a.second] = 0, value[b.second] = 1;
            if ( i == 0 ) {
                x[dr] = a.first + b.first;
                siz[dr] = j;
                dr ++;
            } else
                q.push( {a.first + b.first, j} );
            j ++;
        }
        i = !i;
    }
    for ( i = 0; i <= 2 * n; i ++ )
        siz[i] = x[i] = 0;
    j --;
    long long lg = 0;
    for ( i = 0; i < n; i ++ ) {
        b(i);
        lg += 1LL * siz[i] * v[i];
    }
    fout << lg << '\n';
    for ( i = 0; i < n; i ++ ) {
        fout << siz[i] << ' ' << x[i] << '\n';
    }
    return 0;
}