Cod sursa(job #765616)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 8 iulie 2012 13:30:49
Problema Coduri Huffman Scor 85
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<cstdio>
#define N 2000000
long long q[N];
int n,i,j,k,r[N],s[N],d[N];

void B(int i,long long c,int e)
{if(s[i])
      {B(s[i],2*c,e+1),B(d[i],2*c+1,e+1);
      return;}
r[i]=e,q[i]=c;}

int main()
{freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
       scanf("%d",&r[i]),q[i]=N;
for(j=k=i=1;i<n;i++)
if(k<n&&r[k+1]<=q[j])
       r[i+n]=q[i]=r[k]+r[k+1],s[i+n]=k,d[i+n]=k+1,k+=2,q[0]+=q[i];
else
       if(q[j+1]<=r[k]||k>n)
                r[i+n]=q[i]=q[j]+q[j+1],s[i+n]=j+n,d[i+n]=s[i+n]+1,j+=2,q[0]+=q[i];
       else
                {r[i+n]=q[i]=r[k]+q[j],s[i+n]=k,d[i+n]=j+n,q[0]+=q[i],j++,k++;
                if(q[j]<=r[k]&&r[k]<=q[j+1])
                          s[i+n]=j+n-1,d[i+n]=k-1;}
printf("%lld\n",q[0]),B(2*n-1,0,0);
for(i=1;i<=n;i++)
        printf("%d %lld\n",r[i],q[i]);
return 0;}