Cod sursa(job #1242489)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 14 octombrie 2014 16:02:17
Problema Coduri Huffman Scor 75
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
#define tip long long
#define N 2000010
using namespace std;
tip val[N],sol,vl,x,lg;
int n,i,tata[N],top1,top2,front1,front2,poz1,poz2,bit;
inline tip select()
{
    if(top1<front1)
    {
        top1=top2;
        front1=front2;
        front2=top1+1;
    }
    if(top2<front2)
        return front1++;
    return val[front1]<=val[front2]?front1++:front2++;
}
int main()
{
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%lld",&val[i]);
    top1=top2=n;
    front1=1;
    front2=top2+1;
    for(i=n+1;i<2*n;i++)
    {
        poz1=select();
        poz2=select();
         x=(++top2)<<1;
        tata[poz1]=x;
        tata[poz2]=x+1;
        val[top2]=val[poz1]+val[poz2];
        sol+=val[top2];
    }
    printf("%lld\n",sol);
    for(i=1;i<=n;i++)
    {
        vl=bit=0;
        lg=-1;
        x=i;
        while(x)
        {
            lg++;
            vl=((tata[x]&1)<<bit)+vl;
            bit++;
            x=tata[x]>>1;
        }
        printf("%lld %lld\n",lg,vl);
    }
    return 0;
}