Pagini recente » Cod sursa (job #3267600) | Cod sursa (job #1920838) | Cod sursa (job #223488) | Cod sursa (job #1476522) | Cod sursa (job #2495912)
#include<fstream>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
long long n,H,m,niv,I,J,s;
long long nivel[1000010],huffman[1000010];
pair<int,int> L[2000010],v[2000010];
void dfs(long long nod, long long cod){
niv++;
if(nod<=H){
huffman[nod]=cod;
nivel[nod]=niv;
s+= (nivel[nod]*v[nod]);
}
else{
dfs(L[nod].first, (cod<<1)+0);
dfs(L[nod].second,(cod<<1)+1);
}
niv--;
}
int main(){
fin>>n;m=2*n-1;H=n;
for(int i=1;i<=n;i++){
fin>>v[i];
v[i+n]=1<<30;
}
v[m+2]=v[m+3]=1<<30;
I=1;J=n+1;
while(n<m){
if(v[I+1]<=v[J]){
v[++n]=v[I]+v[I+1];
L[n]=make_pair(I,I+1);
I+=2;
continue;
}
if(v[J+1]<=v[I]){
v[++n]=v[J]+v[J+1];
v[J]=v[J+1]=1<<30;
L[n]=make_pair(J,J+1);
J+=2;
continue;
}
v[++n]=v[I]+v[J];
v[J]=1<<30;
L[n]=make_pair(I,J);
I++;J++;
}
niv=-1;
dfs(m,0);
fout<<s<<"\n";
for(int i=1;i<=H;i++)
fout<<nivel[i]<<" "<<huffman[i]<<"\n";
return 0;
}