Pagini recente » Cod sursa (job #696890) | Cod sursa (job #2495148) | Cod sursa (job #1820550) | Cod sursa (job #2046755) | Cod sursa (job #623949)
Cod sursa(job #623949)
#include<cstdio>
#define Nmax 1000010
#define inf 0x3f3f3f3f
using namespace std;
int N,v[2*Nmax],u,p,q,s[2*Nmax],d[2*Nmax],l[2*Nmax];
long long nr,c[2*Nmax];
int main(){+
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&N);
for(int i=1;i<=N;++i)
scanf("%d",&v[i]);
q=N+1;
p=1;
u=N;
while(p<=N){
long long mn1,mn2,mn3;
mn1=mn2=mn3=inf;
if(p<N)
mn1=v[p]+v[p+1];
if(p<=N && q>N && q<=u)
mn2=v[p]+v[q];
if(q<u)
mn3=v[q]+v[q+1];
if(mn1 <= mn2 && mn1 <= mn3){
v[++u]=mn1;
s[u]=p;
d[u]=p+1;
p+=2;
nr+=mn1;
}
else
if(mn2<=mn1 && mn2 <=mn3 ){
v[++u]=mn2;
s[u]=p;
d[u]=q;
++p;
++q;
nr+=mn2;
}
else {
v[++u]=mn3;
s[u]=q;
d[u]=q+1;
q+=2;
nr+=mn3;
}
}
while(q<u){
v[++u]=v[q]+v[q+1];
s[u]=q;
d[u]=q+1;
q+=2;
nr+=v[u];
}
for(int t=u;t>N;--t){
l[s[t]]=l[t]+1;
l[d[t]]=l[t]+1;
c[s[t]]=c[t]<<1;
c[d[t]]=(c[t]<<1)+1;
}
printf("%lld\n",nr);
for(int i=1;i<=N;++i)
printf("%d %lld\n",l[i],c[i]);
return 0;
}