Pagini recente » Cod sursa (job #472436) | Cod sursa (job #2876485) | Cod sursa (job #697034) | Cod sursa (job #2051378) | Cod sursa (job #724001)
Cod sursa(job #724001)
#include<cstdio>
#define nmax 1000010
using namespace std;
int n,c1,c2,nr,L[2*nmax],st[nmax],dr[nmax];
long long q1[nmax],q2[nmax],cod[2*nmax],sol;
int main()
{
int i;
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d", &n);
for(i=1;i<=n;i++)
scanf("%lld", &q1[i]);
q2[1]=q1[1]+q1[2];
sol=q2[1];
c1=3;
c2=1;
nr=1;
st[n+1]=1;
dr[n+1]=2;
for(;c1<n;)
{
if(c2<nr)
if(q1[c1+1]<=q2[c2]){q2[++nr]=q1[c1]+q1[c1+1];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c1+1;c1+=2;}
else
if(q2[c2+1]<=q1[c1]){q2[++nr]=q2[c2]+q2[c2+1];sol+=q2[nr];st[nr+n]=c2+n;dr[nr+n]=c2+n+1;c2+=2;}
else{q2[++nr]=q1[c1]+q2[c2];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c2+n;c1++;c2++;}
else
if(c2==nr)
if(q1[c1+1]<=q2[c2]){q2[++nr]=q1[c1]+q1[c1+1];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c1+1;c1+=2;}
else{q2[++nr]=q1[c1]+q2[c2];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c2+n;c1++;c2++;}
else{q2[++nr]=q1[c1]+q1[c1+1];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c1+1;c1+=2;}
}
for(;c1==n&&c2<=nr;)
{
if(c2<nr)
{
if(q2[c2+1]<=q1[c1]){q2[++nr]=q2[c2]+q2[c2+1];sol+=q2[nr];st[nr+n]=c2+n;dr[nr+n]=c2+n+1;c2+=2;}
else{q2[++nr]=q1[c1]+q2[c2];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c2+n;c1++;c2++;}
}
else{q2[++nr]=q1[c1]+q2[c2];sol+=q2[nr];st[nr+n]=c1;dr[nr+n]=c2+n;c1++;c2++;}
}
for(;c2<nr;){q2[++nr]=q2[c2]+q2[c2+1];sol+=q2[nr];st[nr+n]=c2+n;dr[nr+n]=c2+n+1;c2+=2;}
printf("%lld\n",sol);
for(i=nr+n;i>n;i--)
{
L[st[i]]=L[i]+1;
L[dr[i]]=L[i]+1;
cod[st[i]]=2*cod[i];
cod[dr[i]]=2*cod[i]+1;
}
for(i=1;i<=n;i++)
printf("%d %lld\n", L[i], cod[i]);
return 0;
}