Cod sursa(job #1212154)

Utilizator mariusn01Marius Nicoli mariusn01 Data 23 iulie 2014 21:26:16
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <cstdio>
#include <vector>
#include <cstring>

#define DIM 1000010
#define INF (1LL<<62)

using namespace std;
FILE *fin = fopen("huffman.in","r");
FILE *fout = fopen("huffman.out","w");

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

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

int H[DIM];

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

    if (nod <= n) {
        C[nod] = cod;
        H[nod] = niv;

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

int main() {
    memset(V, 1, sizeof(V));
    memset(W, 1, sizeof(W));

    fscanf(fin, "%d", &n);
    for (i=1;i<=n;i++)
        fscanf(fin, "%lld", &V[i]);

    i = 1;
    j = 1;
    m = 0;
    k = n;
    int t = 2*n-1;
    while (k<t) {
        // doua din V
        if (V[i+1] <= W[j]) {
            k++;
            L[k] = make_pair(V[i]+V[i+1], make_pair(i, i+1) );
            m++;
            W[m] = V[i]+V[i+1];
            i+=2;

            continue;
        }

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

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

        //cate una din fiecare        //cate una din fiecare
    }

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

    return 0;
}