Cod sursa(job #770854)

Utilizator sunt_emoSunt emo sunt_emo Data 24 iulie 2012 00:01:09
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#define Inf 8000000000000000000LL

using namespace std;

short lung[1000010];
long long val[1000010],lg=0;
long long k[2000020],t1,t2;
int h[2000020],n;

inline void huff (int c,int u,long long v)
{
    if (c<n) {
        lung[c]=u;
        val[c]=v;
        lg+=u*k[c];
        return;
    }
    c-=n;
    huff (h[c<<1],u+1,v<<1);
    huff (h[(c<<1)+1],u+1,(v<<1)+1);
}

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

int main () {
    int i=0,c1=0,c2,d2,c=2;
    in >> n;
    c2=d2=n+1;
    long long t1,t2;
    for (; i<n; i++)
        in >> k[i];
    for (; i<=n<<1; i++) k[i]=Inf;
    while (1) {
        if (k[c1]<=k[c2]) {
            h[c++]=c1;
            t1=k[c1++];
        }
        else {
            h[c++]=c2;
            t1=k[c2++];
        }
        if (k[c1]<=k[c2]) {
            h[c++]=c1;
            t2=k[c1++];
        }
        else {
            h[c++]=c2;
            t2=k[c2++];
        }
        if (t2==Inf) break;
        k[d2++]=t1+t2;
    }
    huff (c-3,0,0);
    out << lg << "\n";
    for (i=0; i<n; i++)
        out << lung[i] << " " << val[i] << "\n";
    in.close();
    out.close();
    return 0;
}