Pagini recente » Cod sursa (job #2823300) | Cod sursa (job #2421159) | Cod sursa (job #2881583) | Cod sursa (job #1113222) | Cod sursa (job #2624776)
#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
long long sz[2*N];
int l[2*N];
int r[2*N];
queue<int> q1;
queue<int> q2;
int idg=0;
int getmin(){
if(q1.empty()){
int ans=q2.front();
q2.pop();
return ans;
}
if(q2.empty()){
int ans=q1.front();
q1.pop();
return ans;
}
if(sz[q1.front()]<=sz[q2.front()]){
int ans=q1.front();
q1.pop();
return ans;
}
int ans=q2.front();
q2.pop();
return ans;
}
long long cod[N];
int len[N];
long long ans=0;
void dfs(int node,long long code,int ln){
if(l[node]==0 && r[node]==0){
cod[node]=code;
len[node]=ln;
ans+=1LL*ln*sz[node];
return;
}
dfs(l[node],code*2LL,ln+1);
dfs(r[node],code*2LL+1,ln+1);
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++){
int v;
cin>>v;
int nou = ++idg;
sz[nou]=v;
q1.push(nou);
}
while(q1.size() +q2.size()>1){
int min1=getmin();
int min2=getmin();
int nou = ++idg;
l[nou]=min1;
r[nou]=min2;
sz[nou]=sz[min1]+sz[min2];
q2.push(nou);
}
int root=q2.front();
dfs(root,0,0);
cout<<ans<<"\n";
for(int i=1;i<=n;i++){
cout<<len[i]<<" "<<cod[i]<<"\n";
}
return 0;
}