Pagini recente » Cod sursa (job #2033934) | Cod sursa (job #2256866) | Cod sursa (job #1269193) | Cod sursa (job #2416281) | Cod sursa (job #796737)
Cod sursa(job #796737)
#include <stdio.h>
#define NMAX 1000005
#define LMAX 2000005
#define ll long long
int n,A[NMAX],B[NMAX],r,p1,p2,poz[NMAX],t;
int st[LMAX],dr[LMAX];
char L[LMAX];
ll val[LMAX],C[LMAX],rez;
inline int check(int x,int y)
{
if (x==n+1)
return 0;
if (y==r+1)
return 1;
return A[x]<C[B[y]];
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&n);
int i,nod1,nod2;
for (i=1; i<=n; i++)
scanf("%d",&A[i]);
while (p1<n || p2<r)
{
if (check(p1+1,p2+1))
C[++t]=A[++p1],poz[p1]=t,nod1=t;
else
nod1=B[++p2];
if (check(p1+1,p2+1))
C[++t]=A[++p1],poz[p1]=t,nod2=t;
else
nod2=B[++p2];
C[++t]=C[nod1]+C[nod2];
st[t]=nod1; dr[t]=nod2;
B[++r]=t;
if (p1==n && r-p2==1)
break ;
}
for (i=t; i>=1; i--)
if (st[i] && dr[i])
{
L[st[i]]=L[dr[i]]=L[i]+1;
val[st[i]]=val[i]*2;
val[dr[i]]=val[i]*2+1;
rez+=C[i];
}
printf("%lld\n",rez);
for (i=1; i<=n; i++)
printf("%d %lld\n",L[poz[i]],val[poz[i]]);
return 0;
}