Cod sursa(job #479410)

Utilizator andra23Laura Draghici andra23 Data 23 august 2010 21:42:22
Problema Coduri Huffman Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<iostream>
#include<fstream>

using namespace std;

int c1[1000010], st[2000010], dr[2000010];
long long c2[1000010];
int h[1000010], val[1000010], n;

void inordine(int nod, int hh, int v){
    if (nod <= n){
        h[nod] = hh;
        val[nod] = v;    
    }
    else {
        inordine(st[nod], hh+1, v<<1);
        inordine(dr[nod], hh+1, (v<<1)+1);
    }    
}

int main(){
    ifstream f("huffman.in");
    ofstream g("huffman.out");
    int i, min1, min2, stang, drept;
    f>>n;
    for (i = 1; i <= n; i++)
        f>>c1[i];
    long long sg = 0;
    
    int p1 = 1;
    int p2 = 1;
    c1[n+1] = 9223372036854775807LL;
    c2[1] = 200000000;
    int u = 0;
    
    while (u < n-1){
        if ((p1>n) || (c2[p2] <= c1[p1])){
            min1 = c2[p2];
            stang = n+p2;
            p2++;
        }
        else {
            min1 = c1[p1];
            stang = p1;
            p1++;
        }  
        if ((p1>n) || (p2 <= u && c2[p2] <= c1[p1])){
            min2 = c2[p2];
            drept = n+p2;
            p2++;
        }
        else {
            min2 = c1[p1];
            drept = p1;
            p1++;
        }  
        u++;
        c2[u] = min1+min2;
        sg = sg+c2[u]; 
        st[n+u] = stang;
        dr[n+u] = drept; 
    }    
        
    inordine(2*n-1, 0, 0);    
    
    g<<sg<<'\n';
    for (i = 1; i <= n; i++)
        g<<h[i]<<" "<<val[i]<<'\n';
    
    return 0;    
}