Pagini recente » Cod sursa (job #3263115) | Cod sursa (job #3289281) | Cod sursa (job #3274717) | Cod sursa (job #3285674) | Cod sursa (job #3262640)
#include <fstream>
#include <set>
#define f first
#define s second
using namespace std;
ifstream cin("huffman.in");
ofstream cout("huffman.out");
const int NMAX=1e6+5;
pair<int, int> ans[NMAX];
int n;
long long sum;
struct arb
{
int et;
long long val;
arb *l, *r;
arb(int i, int nr)
{
et=i;
val=nr;
l=r=NULL;
}
arb(arb *p1, arb *p2)
{
et=0;
val=p1->val+p2->val;
l=p1; r=p2;
}
} *root;
set <pair<long long, arb*>> s;
void dfs(arb* node, int lvl, int code)
{
if(node->et)
{
ans[node->et]={lvl, code};
sum+=lvl*node->val;
return;
}
dfs(node->l, lvl+1, 2*code);
dfs(node->r, lvl+1, 2*code+1);
}
signed main()
{
int i, val;
cin>>n;
for(i=1; i<=n; i++)
{
cin>>val;
arb *nod=new arb(i, val);
s.insert({val, nod});
}
arb *p1, *p2;
while(!s.empty())
{
p1=(*s.begin()).s; s.erase(s.begin());
if(s.empty())
{
root=p1;
break;
}
p2=(*s.begin()).s; s.erase(s.begin());
arb *p3=new arb(p1, p2);
s.insert({p3->val, p3});
}
dfs(root, 0, 0);
cout<<sum<<'\n';
for(i=1; i<=n; i++) cout<<ans[i].f<<' '<<ans[i].s<<'\n';
}