Pagini recente » Cod sursa (job #1601836) | Cod sursa (job #2767926) | Cod sursa (job #2959069) | Cod sursa (job #2201285) | Cod sursa (job #2059948)
#include<stdio.h>
#define NMAX 1000100
#define INF 1LL * 1000000000 * 2000000000
int N,lg[NMAX],cc[NMAX],fs[2*NMAX],fd[2*NMAX],NC;
long long val[2*NMAX],cod[NMAX],S;
void df(int pp,int h,long long cd){
if(pp<=N){
lg[pp]=h;
cod[pp]=cd;
return;
}
df(fs[pp],h+1,cd<<1);
df(fd[pp],h+1,(cd<<1)+1);
}
int main(){
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
int i,p,u,a,b,c,vv;
scanf("%d",&N);
for(i=1;i<=N;++i){
scanf("%d",&vv);
val[i]=(long long)vv;
}
for(;i<=(N<<1)+2;++i)
val[i]=INF;
val[0]=INF;
i=N+1;
c=1;
u=0;
p=1;
while(1){
if(val[c]<val[cc[p]]){
a=c++;
if(val[c]<val[cc[p]])
b=c++;
else
b=cc[p++];
}
else{
a=cc[p++];
if(val[c]<val[cc[p]])
b=c++;
else
b=cc[p++];
}
if(val[a]==INF || val[b]==INF)
break;
val[++i]=val[a]+val[b];
S+=val[i];
fs[i]=a;
fd[i]=b;
cc[++u]=i;
}
df(i,0,0);
printf("%lld\n",S);
for(i=1;i<=N;++i)
printf("%d %lld\n",lg[i],cod[i]);
fclose(stdin);
fclose(stdout);
return 0;
}