Pagini recente » Cod sursa (job #2937363) | Cod sursa (job #2573109) | Cod sursa (job #2571678) | Cod sursa (job #1508113) | Cod sursa (job #2498002)
#include <fstream>
#define K 1000002
#define INF 1000000000000000001LL
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n,i,j,k,t,lg[K];
long long v[2*K],cod[K],total;
pair <int,int> L[2*K];
void dfs(int nod,int niv,long long nr){
if(nod<=n){///e frunza,ma opresc
lg[nod]=niv;
cod[nod]=nr;
total+=niv*v[nod];
return;
}
dfs(L[nod].first,niv+1,nr*2);/// pe stanga adaug '0' la prefix
dfs(L[nod].second,niv+1,nr*2+1);///pe dreapta '1' (baza 2)
}
int main(){
fin>>n;
for(i=1;i<=n;i++)
fin>>v[i];
t=2*n-1;///in total o sa am t noduri in arbore
for(i=n+1;i<=t+3;i++)
v[i]=INF;///ca sa nu mai pun conditii sa nu depaseasca n
i=1;
j=n+1;
k=n;
while(k<t){
if(v[i+1]<=v[j]){///iau 2 de la inceput
v[++k]=v[i]+v[i+1];
L[k]={i,i+1};
i+=2;
}
else if(v[j+1]<=v[i]){///iau 2 de la sfarsit
v[++k]=v[j]+v[j+1];
L[k]={j,j+1};
v[j]=v[j+1]=INF;///ca sa nu mi le mai ia iar cand ajunge i>n
j+=2;
}
else{///unul de la inceput,unul de la sfarsit
v[++k]=v[i]+v[j];
L[k]={i,j};
v[j]=INF;
i++;
j++;
}
}
dfs(t,0,0);///incep cu a t-a muchie pe nivel 0 si cod 0
fout<<total<<"\n";
for(i=1;i<=n;i++)
fout<<lg[i]<<" "<<cod[i]<<"\n";
return 0;
}