Pagini recente » Rating Neagu Robert (ultras_robert) | Cod sursa (job #234319) | Cod sursa (job #1188108) | Cod sursa (job #1596239) | Cod sursa (job #2496240)
#include <bits/stdc++.h>
#define DIM 1000010
using namespace std;
ifstream fin ("huffman.in");
ofstream fout ("huffman.out");
struct {
long long fiu_stanga=0;
long long fiu_dreapta=0;
long long val;
}v[2*DIM];
long long n,i,dim,j,total;
long long COD[DIM],LNG[DIM];
void dfs(int nod, long long cod, int lng){
//cout<<nod<<" "<<cod<<"\n";
if(nod<=n){
COD[nod]=cod;
LNG[nod]=lng;
total+=lng*v[nod].val;
}
if(v[nod].val){
dfs(v[nod].fiu_stanga, (cod<<1), lng+1);
dfs(v[nod].fiu_dreapta, (cod<<1)+1, lng+1);
}
}
int alege_minime(int i, int j){ ///scrisa urat
if(j > dim)
return 1;
if(i > n)
return 2;
if(j<dim && i<n){
if(v[i+1].val < v[j].val)
return 1;
else
if(v[j+1].val < v[i].val)
return 2;
else{
if(v[i].val > v[j].val)
return 3;
else
return 4;
}
}
else{
if(j==dim){
if(v[i+1].val < v[j].val){
return 1;
}
else{
if(v[i].val > v[j].val)
return 3;
else
return 4;
}
}
else{
if(v[j+1].val < v[i].val){
return 2;
}
else{
if(v[i].val > v[j].val)
return 3;
else
return 4;
}
}
}
}
int main(){
fin>>n;
for(i=1;i<=n;i++)
fin>>v[i].val;
dim=n;
i=1;
j=n+1;
for(int alegeri=1;alegeri<n;alegeri++){
int caz=alege_minime(i,j);
dim++;
if(caz==1){
v[dim].val=v[i].val+v[i+1].val;
v[dim].fiu_stanga=i;
v[dim].fiu_dreapta=i+1;
i+=2;
}
else
if(caz==2){
v[dim].val=v[j].val+v[j+1].val;
v[dim].fiu_stanga=j;
v[dim].fiu_dreapta=j+1;
j+=2;
}
else
if(caz==3){
v[dim].val=v[i].val+v[j].val;
v[dim].fiu_stanga=i;
v[dim].fiu_dreapta=j;
i++;
j++;
}
else{
v[dim].val=v[i].val+v[j].val;
v[dim].fiu_stanga=j;
v[dim].fiu_dreapta=i;
i++;
j++;
}
}
int radacina=2*n-1;
//for(i=1;i<=2*n-1;i++)
//fout<<v[i].fiu_stanga<<" "<<v[i].fiu_dreapta<<"\n";
dfs(radacina,0,0);
fout<<total<<"\n";
for(i=1;i<=n;i++)
fout<<LNG[i]<<" "<<COD[i]<<"\n";
return 0;
}