Pagini recente » Cod sursa (job #3282332) | Cod sursa (job #444196) | Cod sursa (job #2116285) | Cod sursa (job #2318284) | Cod sursa (job #1081930)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fi("huffman.in");
ofstream fo("huffman.out");
struct node{
long long val;
int l,r;}
arb[1000100<<1];
long long code[1000100<<1][2],size=0;
int n;
long long dfs(int nod,long long cod,int depth){
if (arb[nod].l)
return dfs(arb[nod].l,cod<<1,depth+1)+dfs(arb[nod].r,(cod<<1)+1,depth+1);
code[nod][0]=depth;
code[nod][1]=cod;
return arb[nod].val*depth;
}
int solve(){
int p1=1,p2=n+1,len=n;
while (p1<n||p2<len){
arb[++len].val=0;
if (p1<=n&&(p2>=len||arb[p1].val<=arb[p2].val)){
arb[len].val+=arb[p1].val;
arb[len].l=p1,p1++;}
else {
arb[len].val+=arb[p2].val;
arb[len].l=p2,p2++;}
if (p1<=n&&(p2>=len||arb[p1].val<=arb[p2].val)){
arb[len].val+=arb[p1].val;
arb[len].r=p1,p1++;}
else {
arb[len].val+=arb[p2].val;
arb[len].r=p2,p2++;}
}
return len;
}
int main() {
fi>>n;
for (int i=1;i<=n;i++){
fi>>arb[i].val;
arb[i].l=arb[i].r=0;}
fo<<dfs(solve(),0,0)<<'\n';
for (int i=1;i<=n;i++)
fo<<code[i][0]<<' '<<code[i][1]<<'\n';
}