Cod sursa(job #2495435)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 19 noiembrie 2019 13:12:56
Problema Coduri Huffman Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
#define DIM 1000005

using namespace std;

ifstream fin  ("huffman.in");
ofstream fout ("huffman.out");

long long n, i, j, k, m, t, niv, cost;
long long h[DIM], c[DIM], v[DIM], w[DIM];

pair <long long, pair<long long, long long> > L[2*DIM];

void dfs (long long nod, long long codificare){
    niv++;
    if (nod > n){
        cost += L[nod].first;
    }
    else{
        c[nod] = codificare;
        h[nod] = niv;
    }
    if (L[nod].first){
        dfs (L[nod].second.first, codificare<<1);
        dfs (L[nod].second.second, (codificare<<1) + 1);
    }
    niv--;
}

int main(){
    fin >> n;
    memset(v, 1, sizeof(v));
    memset(w, 1, sizeof(w));
    for (i=1; i<=n; i++){
        fin >> v[i];
    }
    i = 1, j = 1, k = n, t = 2*n-1;
    while (k < t){
        if (v[i+1] <= w[j]){
            L[++k] = make_pair (v[i] + v[i+1], make_pair(i, i+1));
            w[++m] = v[i] + v[i+1];
            i+=2;
        }
        else if (w[j+1] <= v[i]){
            L[++k] = make_pair (w[j] + w[j+1], make_pair(n+j, n+j+1));
            w[++m] = w[j] + w[j+1];
            j+=2;
        }
        else{
            L[++k] =  make_pair (v[i] + w[j], make_pair(i, n+j));
            w[++m] = v[i] + w[j];
            i++, j++;
        }
    }
    niv = -1;
    dfs(2*n-1, 0);
    fout << cost << "\n";
    for (i=1; i<=n; i++){
        fout << h[i] << " " << c[i] << "\n";
    }
    return 0;
}