Cod sursa(job #1524195)

Utilizator serbanSlincu Serban serban Data 13 noiembrie 2015 17:15:43
Problema Coduri Huffman Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("huffman.in");
ofstream g("huffman.out");

long long a[2000005];
int ls[2000005];
int rs[2000005];

int n, v;
pair<int, long long> b[1000005];

void dfs(int poz, long long p, int niv) {
    if(poz <= n) {
        b[poz].first = niv;
        b[poz].second = p;
        return ;
    }
    dfs(ls[poz], p * 2, niv + 1);
    dfs(rs[poz], p * 2 + 1, niv + 1);
}

pair<long long, int> q[1000005];
int h;

void sus(int poz) {
    pair<long long, int> key = q[poz];
    while(poz > 1 && key.first > q[poz / 2].first) {
        q[poz] = q[poz / 2];
        poz /= 2;
    }
    q[poz] = key;
}

void jos(int poz) {
    int son;
    do {
        son = 0;
        if((poz << 1) <= h) {
            son = poz << 1;
            if((son + 1) <= h && q[son + 1].first > q[son].first)
                son ++;
            if(q[son].first <= q[poz].first)
                son = 0;
        }
        if(son) {
            pair<long long, int> aux = q[poz];
            q[poz] = q[son];
            q[son] = aux;
            poz = son;
        }
    }
    while(son);
}

void ins(pair<long long, int> aux) {
    q[h] = aux;
    sus(h);
}

void top() {
    pair<long long, int> aux = q[1];
    q[1] = q[h];
    q[h] = aux;
    h --;
    jos(1);
}

int main()
{
    q[0].first = -1000000005;
    f >> n;
    for(int i = 1; i <= n; i ++) {
        f >> a[i];
        h = i;
        ins(make_pair(-a[i], i));
    }

    int m = n;
    while(h > 1) {
        top(); int fst = q[h + 1].second;
        top(); int snd = q[h + 1].second;
        h ++;
        m ++;
        a[m] = a[fst] + a[snd];
        ls[m] = fst; rs[m] = snd;
        ins(make_pair(-a[m], m));
    }

    int start = m;
    dfs(start, 0, 0);

    long long s = 0;
    for(int i = 1; i <= n; i ++) {
        s += b[i].first * a[i];
    }
    g << s << "\n";
    for(int i = 1; i <= n; i ++) {
        g << b[i].first << " " << b[i].second << "\n";
    }
    return 0;
}