Pagini recente » Cod sursa (job #90986) | Cod sursa (job #2535173) | Cod sursa (job #3222170) | Cod sursa (job #1492810) | Cod sursa (job #2624773)
#include <iostream>
#include <fstream>
#include <queue>
const int NMAX=1000005;
struct nod{
int st,dr;
long long val;
}v[2*NMAX];
struct rez{
int lungime;
long long nr;
}valf[NMAX];
int nart,n;
std::queue<int>q1,q2;
std::ifstream in("huffman.in");
std::ofstream out("huffman.out");
int getNod(){
if(q1.empty()){
int aux=q2.front();
q2.pop();
return aux;
}
if(q2.empty()){
int aux=q1.front();
q1.pop();
return aux;
}
if(v[q1.front()].val<=v[q2.front()].val){
int aux=q1.front();
q1.pop();
return aux;
}
int aux=q2.front();
q2.pop();
return aux;
}
void adauga(int x,int y){
v[nart].val=v[x].val+v[y].val;
v[nart].st=x;
v[nart].dr=y;
nart++;
}
void dfs(int nod,int dist,long long val){
if(v[nod].st==0 || v[nod].dr==0){
valf[nod].lungime=dist;
valf[nod].nr=val;
return;
}
dfs(v[nod].st,dist+1,val);
dfs(v[nod].dr,dist+1,val+(1LL<<dist));
}
int main(){
long long sum=0;
in>>n;
for(int i=1;i<=n;i++)
in>>v[i].val,q1.push(i);
nart=n+1;
while(q1.size()+q2.size()!=1){
int nod1=getNod(),nod2=getNod();
adauga(nod1,nod2);
q2.push(nart-1);
}
int radacina=getNod();
dfs(radacina,0,0);
for(int i=n+1;i<nart;i++)
sum+=v[i].val;
out<<sum<<'\n';
for(int i=1;i<=n;i++){
long long rezx=0,lungime=valf[i].lungime,nr=valf[i].nr;
for(int j=0;j<lungime;j++)
if(nr & (1LL<<j))
rezx+=(1LL<<(lungime-j-1));
out<<lungime<<" "<<rezx<<'\n';
}
return 0;
}