Cod sursa(job #1525636)

Utilizator UMihneaUngureanu Mihnea UMihnea Data 15 noiembrie 2015 12:28:22
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#define N 2000010

using namespace std;

int n,i,b1,b2,e1,e2,lg[N],s[N],d[N];
long long v[N],t,c[N];

int main()
{
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%lld",&v[i]);
    b1=0;
    b2=n;
    e1=n;
    e2=n;
    while(b1<n)
    {
        if((b2==e2)||(e1-b1>1&&e2>b2&&v[b1+1]<=v[b2]))
        {
            v[e2]=v[b1]+v[b1+1];
            s[e2]=b1;
            d[e2]=b1+1;
            e2++;
            b1+=2;
            continue;
        }
        if((b1==e1)||(e2-b2>1&&e1>b1&&v[b2+1]<=v[b1]))
        {
            v[e2]=v[b2]+v[b2+1];
            s[e2]=b2;
            d[e2]=b2+1;
            e2++;
            b2+=2;
            continue;
        }
        v[e2]=v[b1]+v[b2];
        s[e2]=b1;
        d[e2]=b2;
        e2++; b1++; b2++;
    }
    while(e2<2*n-1)
        {
            v[e2]=v[b2]+v[b2+1];
            s[e2]=b2;
            d[e2]=b2+1;
            e2++;
            b2+=2;
            continue;
        }
    for(i=e2-1;i>=n;i--)
    {
        c[s[i]]=2*c[i];
        c[d[i]]=2*c[i]+1;
        lg[s[i]]=lg[d[i]]=lg[i]+1;
        t+=v[i];
    }
    printf("%lld\n",t);
    for(i=0;i<n;i++)
        printf("%d %lld\n",lg[i],c[i]);
    return 0;
}