Pagini recente » Cod sursa (job #2474527) | Cod sursa (job #2393515) | Cod sursa (job #53857) | Cod sursa (job #2529147) | Cod sursa (job #2659368)
#include <bits/stdc++.h>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
long long v[2000005];
queue<int> init, intern;
int n,nr;
long long s;
int mu[2000005][2];
long long rez[1000005];
int lung[1000005];
long long getmin(){
int ret = 0;
if(!init.empty() && (intern.empty() || v[init.front()] <= v[intern.front()])){
ret = init.front();
init.pop();
return ret;
}
ret = intern.front();
intern.pop();
return ret;
}
void dfs(int ind_nod,long long cod,int l){
if(ind_nod<=n){
rez[ind_nod]=cod;
lung[ind_nod]=l;
return;
}
dfs(mu[ind_nod][0],cod<<1,l+1);
dfs(mu[ind_nod][1],(cod<<1)|1,l+1);
}
int main()
{
in>>n;
for(int i=1;i<=n;i++){
in>>v[i];
init.push(i);
}
nr=n;
while((int)init.size() + (int)intern.size() > 1){
long long a,b;
a=getmin();
b=getmin();
int c;
nr++;
c=nr;
v[c]=v[a]+v[b];
intern.push(c);
mu[nr][0]=a;
mu[nr][1]=b;
s+=v[c];
}
dfs(nr,0,0);
out<<s<<"\n";
for(int i=1;i<=n;i++)
out<<lung[i]<<" "<<rez[i]<<"\n";
return 0;
}