Pagini recente » Cod sursa (job #126950) | Cod sursa (job #2566072) | Cod sursa (job #2706735) | Cod sursa (job #2950176) | Cod sursa (job #372387)
Cod sursa(job #372387)
#include<stdio.h>
#define N 2000011
int n,i,j,k,p1,p2,u1,u2,t[N],c[N],lg;
long long sol,v[N],h;
void read(),solve();
int main()
{
read();
solve();
return 0;
}
void read()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%lld",&v[i]);
}
void solve()
{
sol=v[n+1]=v[1]+v[2];c[2]=1;t[1]=t[2]=n+1;
p1=3;u1=n;p2=u2=n+1;
while(p1<u1)
{
if(p2<u2)
{
if(v[p1+1]<=v[p2])
{
u2++;
v[u2]=v[p1]+v[p1+1];sol+=v[u2];
c[p1+1]=1;
t[p1]=t[p1+1]=u2;
p1+=2;
}
else
if(v[p2+1]<=v[p1])
{
u2++;
v[u2]=v[p2]+v[p2+1];sol+=v[u2];
c[p2+1]=1;t[p2]=t[p2+1]=u2;
p2+=2;
}
else
{
u2++;
v[u2]=v[p1]+v[p2];sol+=v[u2];
c[p2]=1;
t[p1]=t[p2]=u2;
p1++;p2++;
}
continue;
}
if(p2==u2)
{
if(v[p1+1]<=v[p2])
{
u2++;
v[u2]=v[p1]+v[p1+1];sol+=v[u2];
c[p1+1]=1;
t[p1]=t[p1+1]=u2;
p1+=2;
}
else
{
u2++;
v[u2]=v[p1]+v[p2];sol+=v[u2];
c[p2]=1;
t[p1]=t[p2]=u2;
p1++;p2++;
}
continue;
}
u2++;
v[u2]=v[p1]+v[p1+1];sol+=v[u2];
c[p1+1]=1;
t[p1]=t[p1+1]=u2;
p1+=2;
}
while(p1==u1&&p2<=u2)
{
if(p2<u2)
{
if(v[p2+1]<=v[p1])
{
u2++;
v[u2]=v[p2]+v[p2+1];sol+=v[u2];
c[p2+1]=1;t[p2]=t[p2+1]=u2;
p2+=2;
}
else
{
u2++;
v[u2]=v[p1]+v[p2];sol+=v[u2];
c[p2]=1;
t[p1]=t[p2]=u2;
p1++;p2++;
}
continue;
}
u2++;
v[u2]=v[p1]+v[p2];sol+=v[u2];
c[p2]=1;
t[p1]=t[p2]=u2;
p1++;p2++;
}
while(p2<u2)
{
u2++;
v[u2]=v[p2]+v[p2+1];sol+=v[u2];
c[p2+1]=1;
t[p2]=t[p2+1]=u2;
p2+=2;
}
printf("%lld\n",sol);k=2*n-1;
for(i=n;i>=1;i--)
{
lg=0;h=0;
for(j=i;j<k;j=t[j])
{
lg++;h*=2;h+=c[j];
}
printf("%d %lld\n",lg,h);
}
}