Pagini recente » Cod sursa (job #177653) | Cod sursa (job #2108307) | Cod sursa (job #1079581) | Cod sursa (job #783074) | Cod sursa (job #2920098)
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin ("huffman.in");
ofstream fout("huffman.out");
const int dim=3e6+9;
int n,cost_total;
int cost[dim],fv[dim];
int len[dim],cod[dim];
int l[dim],r[dim];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
void dfs(int nod,int cod_curent,int lungime_curenta){
len[nod]=lungime_curenta;
cod[nod]=cod_curent;
if(l[nod]&&r[nod]){
dfs(l[nod],cod_curent*2 ,lungime_curenta+1);
dfs(r[nod],cod_curent*2+1,lungime_curenta+1);
}else{
cost_total+=cost[nod]*lungime_curenta;
}
}
signed main(){
fin>>n;
for(int i=1;i<=n;i++){
fin>>cost[i];
pq.push({cost[i],i});
}
int nr=n;
while(pq.size()>=2){
int x=pq.top().second;
pq.pop();
int y=pq.top().second;
pq.pop();
nr++;
l[nr]=x,r[nr]=y;
cost[nr]=cost[x]+cost[y];
pq.push({cost[nr],nr});
}
dfs(2*n-1,0,0);
fout<<cost_total<<'\n';
for(int i=1;i<=n;i++){
fout<<len[i]<<' '<<cod[i]<<'\n';
}
}