Pagini recente » Cod sursa (job #2999511) | Cod sursa (job #2850102) | Cod sursa (job #2314781) | Cod sursa (job #1360687) | Cod sursa (job #372397)
Cod sursa(job #372397)
#include<stdio.h>
#define N 2000011
int n,i,j,k,p1,p2,u1,u2,f1[N],f2[N],c[N],lg[N];
long long sol,v[N],h[N];
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];
f1[n+1]=1;f2[n+1]=2;
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];
f1[u2]=p1;f2[u2]=p1+1;
p1+=2;
}
else
if(v[p2+1]<=v[p1])
{
u2++;
v[u2]=v[p2]+v[p2+1];sol+=v[u2];
f1[u2]=p2;f2[u2]=p2+1;
p2+=2;
}
else
{
u2++;
v[u2]=v[p1]+v[p2];sol+=v[u2];
f1[u2]=p1;f2[u2]=p2;
p1++;p2++;
}
continue;
}
if(p2==u2)
{
if(v[p1+1]<=v[p2])
{
u2++;
v[u2]=v[p1]+v[p1+1];sol+=v[u2];
f1[u2]=p1;f2[u2]=p1+1;
p1+=2;
}
else
{
u2++;
v[u2]=v[p1]+v[p2];sol+=v[u2];
f1[u2]=p1;f2[u2]=p2;
p1++;p2++;
}
continue;
}
u2++;
v[u2]=v[p1]+v[p1+1];sol+=v[u2];
f1[u2]=p1;f2[u2]=p1+1;
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];
f1[u2]=p2;f2[u2]=p2+1;
p2+=2;
}
else
{
u2++;
v[u2]=v[p1]+v[p2];sol+=v[u2];
f1[u2]=p1;f2[u2]=p2;
p1++;p2++;
}
continue;
}
u2++;
v[u2]=v[p1]+v[p2];sol+=v[u2];
f1[u2]=p1;f2[u2]=p2;
p1++;p2++;
}
while(p2<u2)
{
u2++;
v[u2]=v[p2]+v[p2+1];sol+=v[u2];
f1[u2]=p2;f2[u2]=p2+1;
p2+=2;
}
printf("%lld\n",sol);k=2*n-1;
for(i=k;i>n;i--)
{
lg[f1[i]]=lg[f2[i]]=lg[i]+1;
h[f1[i]]=2*h[i];
h[f2[i]]=2*h[i]+1;
}
for(i=1;i<=n;i++)printf("%d %lld\n",lg[i],h[i]);
}