Cod sursa(job #484682)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 15 septembrie 2010 12:57:19
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
# include <cstdio>
# include <queue>

using namespace std;

# define FIN "huffman.in"
# define FOUT "huffman.out"

const int MAX_N = 1000005;

struct nod {
       int st, dr;
       long long value;
} A[MAX_N << 1];

long long total;
queue<int> Q1, Q2;
int N, i, j, cur;
    
    void df(int Nod, long long vl, int depth) {
         
        if (Nod <= N) {
           A[Nod].st = depth;
           A[Nod].value = vl;
           return;
        }
        
        df(A[Nod].st, vl << 1, depth + 1);
        df(A[Nod].dr, vl << 1 | 1, depth + 1);
    }

    int main() {
        freopen(FIN, "r", stdin);
        freopen(FOUT, "w", stdout);
        
        scanf("%d", &N);
        for (i = 1; i <= N; ++i) {
            
            A[i].st = A[i].dr = 0;
            scanf("%lld\n", &A[i].value);
            Q1.push(i);
        }
        
        int m[2]; cur = N;       
        for (i = 1; i < N; ++i) {
            for (j = 0; j <= 1; ++j) {
                if (Q1.empty()) {
                   m[j] = Q2.front(); Q2.pop();
                   continue;
                }
            
                if (Q2.empty()) {
                   m[j] = Q1.front(); Q1.pop();
                   continue;
                }
                
                if (A[Q1.front()].value < A[Q2.front()].value) {
                   m[j] = Q1.front(); Q1.pop();
                   continue;
                }
                
                m[j] = Q2.front(); Q2.pop();
            }
            
            A[++cur].value = A[m[0]].value + A[m[1]].value;
            A[cur].st = m[0]; A[cur].dr = m[1]; Q2.push(cur);
            total += A[cur].value;
        }
        
        printf("%lld\n", total);
        
        df(cur, 0, 0);
        
        for (i = 1; i <= N; ++i)
           printf("%d %lld\n", A[i].st, A[i].value);
        
        return 0;
    }