Cod sursa(job #765595)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 8 iulie 2012 11:52:31
Problema Coduri Huffman Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<cstdio>
#define N 2000000
long long q[N];
int n,i,j,k,r[N],s[N],d[N],p[N];
int main()
{freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&n);
for(j=k=i=1;i<=n;i++)
       scanf("%d",&r[i]),q[i]=N;
for(i=1;i<n;i++)
       {if(k<=n)
                {if(r[k+1]<=q[j]&&k+1<=n)
                          q[i]=r[k]+r[k+1],s[i+n]=k,d[i+n]=k+1,k+=2;
                else
                          if(q[j+1]<=r[k])
                                    q[i]=q[j]+q[j+1],s[i+n]=j+n,d[i+n]=j+1+n,j+=2;
                          else
                                    if(q[j]<=r[k]&&r[k]<=q[j+1])
                                             q[i]=r[k]+q[j],s[i+n]=j+n,d[i+n]=k,j++,k++;
                                    else
                                             if(r[k]<=q[j]&&((q[j]<=r[k+1]&&k<n)||k+1>n))
                                                       q[i]=r[k]+q[j],s[i+n]=k,d[i+n]=j+n,j++,k++;}
       else
                q[i]=q[j]+q[j+1],s[i+n]=j+n,d[i+n]=j+1+n,j+=2;
       q[0]+=q[i],r[i+n]=q[i];}
printf("%lld\n",q[0]),i=2*n-1,k=j=q[i]=p[i]=0,r[j++]=i;
while(k<j)
        {i=r[k++];
        if(s[i])
                 {p[s[i]]=p[d[i]]=p[i]+1,q[s[i]]=q[i]<<1,q[d[i]]=q[s[i]]+1;
                 if(i>n)
                          r[j++]=s[i],r[j++]=d[i];}}
for(i=1;i<=n;i++)
        printf("%d %lld\n",p[i],q[i]);
return 0;}