Cod sursa(job #1212135)

Utilizator mariusn01Marius Nicoli mariusn01 Data 23 iulie 2014 21:00:32
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <fstream>
#include <vector>
#define DIM 1000010
#define INF (1LL<<62)

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

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

long long cost;
long long C[DIM], V[DIM], W[DIM];

int H[DIM], S[DIM];

int n, m, k, i, j;
long long a, b, c, d;
void df(int nod, int niv, long long cod) {
    S[niv] = cod;
    if (nod > n)
        cost += L[nod].first;

    if (nod <= n) {
/*
        C[nod] = 0;
        for (int i=0;i<=niv;i++)
            if (S[i] != -1)
                C[nod] = C[nod]*2 + S[i];
*/
        C[nod] = cod;
        H[nod] = niv;

    }
    if (L[nod].first > 0) {
        df(L[nod].second.first, niv+1, cod*2);
        df(L[nod].second.second, niv+1, cod*2+1);
    }
}

int main() {
    fin>>n;
    for (i=1;i<=n;i++)
        fin>>V[i];

    i = 1;
    j = 1;
    m = 0;
    k = n;
    while (k<2*n-1) {
        if (i<=n)
            a = V[i];
        else
            a = INF;
        if (i+1<=n)
            b = V[i+1];
        else
            b = INF;
        if (j<=m)
            c = W[j];
        else
            c = INF;
        if (j+1<=m)
            d = W[j+1];
        else
            d = INF;

        // doua din V
        if (b <= c) {
            k++;
            L[k] = make_pair(a+b, make_pair(i, i+1) );
            i+=2;
            m++;
            W[m] = a+b;

            continue;
        }

        //doua din w
        if (d <= a) {
            k++;
            L[k] = make_pair(c+d, make_pair(n+j, n+j+1) );
            j+=2;
            m++;
            W[m] = c+d;

            continue;
        }
        k++;
        L[k] = make_pair(a+c, make_pair(i, n+j) );
        i++;
        j++;
        m++;
        W[m] = a+c;

        //cate una din fiecare
    }

    df(2*n-1, 0, 0);
    fout<<cost<<"\n";
    for (i=1;i<=n;i++)
        fout<<H[i]<<" "<<C[i]<<"\n";

    return 0;
}