Pagini recente » Cod sursa (job #82971) | Cod sursa (job #1876740) | Cod sursa (job #2682899) | Cod sursa (job #989213) | Cod sursa (job #2445797)
#include<fstream>
using namespace std;
#define maxn 1000005
#define inf 1LL * 1000000 * 1000000
int coada[2][maxn],n,prim[2],ultim[2],fiu[2][maxn*2],k,aux,lg[maxn];
long long nod[maxn*2],sol=0,m,coduri[maxn];
ifstream cin("huffman.in");
ofstream cout ("huffman.out");
void huffman(int nod, long long cod, int nivel){
if(fiu[0][nod]){
huffman(fiu[0][nod], cod*2, nivel+1);
huffman(fiu[1][nod], cod*2+1, nivel+1);
return;
}
lg[nod]=nivel;
coduri[nod]=cod;
}
void lungime(){
prim[1]=prim[0]=1;
ultim[0]=k=n;
while(prim[0]+prim[1]<=ultim[0]+ultim[1]){
++k;
for(int i=0; i<2; i++){
m=inf,aux=0;
for(int j=0; j<2; j++)
if(nod[coada[j][prim[j]]]<m && prim[j]<=ultim[j])
m=nod[coada[j][prim[j]]], aux=j;
nod[k]+=m;
fiu[i][k]=coada[aux][prim[aux]++];
}
coada[1][++ultim[1]]=k;
sol+=nod[k];
}
cout<<sol<<'\n';
huffman(k,0,0);
for(int i=1; i<=n; i++)
cout<<lg[i]<<' '<<coduri[i]<<'\n';
}
void solve(){
lungime();
}
int main(){
cin>>n;
for(int i=1; i<=n; i++){
coada[0][i]=i;
cin>>nod[i];
}
solve();
return 0;
}