Pagini recente » Cod sursa (job #1271295) | Cod sursa (job #753953) | Cod sursa (job #1880119) | Cod sursa (job #1570563) | Cod sursa (job #796738)
Cod sursa(job #796738)
#include <stdio.h>
#define NMAX 1000005
#define LMAX 2000005
#define DIM (1<<16)
#define ll long long
int n,A[NMAX],B[NMAX],r,p1,p2,poz[NMAX],t,l;
int st[LMAX],dr[LMAX];
char L[LMAX],buff[DIM];
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]];
}
inline int read()
{
int x=0;
while (buff[l]<'0' || buff[l]>'9')
if (++l==DIM)
fread(buff,1,DIM,stdin),l=0;
while (buff[l]>='0' && buff[l]<='9')
{
x=x*10+buff[l]-'0';
if (++l==DIM)
fread(buff,1,DIM,stdin),l=0;
}
return x;
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
n=read();
int i,nod1,nod2;
for (i=1; i<=n; i++)
A[i]=read();
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;
}