Pagini recente » Statistici Ilinca Miron (ilincamiron) | Profil Unibuc_Forza_Dragulici | Cod sursa (job #1188808) | Cod sursa (job #2562844) | Cod sursa (job #3261306)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
typedef long long ll;
ll ans,sol[1000005],lg[1000005];
int n;
struct node
{
int val;
int lft,rgt;
};
vector<node> t;
queue<int> q1,q2;
int nodes;
int getmin()
{
if(q1.empty())
{
int rez=q2.front();
q2.pop();
return rez;
}
if(q2.empty())
{
int rez=q1.front();
q1.pop();
return rez;
}
int a=q1.front();
int b=q2.front();
if(t[a].val<t[b].val)
{
q1.pop();
return a;
}
q2.pop();
return b;
}
void dfs(int nod,ll l,ll val)
{
if(nod<n)
{
sol[nod]=val;
lg[nod]=l;
return;
}
if(t[nod].lft!=-1)
dfs(t[nod].lft,l+1,val*2LL);
if(t[nod].rgt!=-1)
dfs(t[nod].rgt,l+1,val*2LL+1);
}
int main()
{
ios_base::sync_with_stdio(false);
fin.tie(0);
fin>>n;
for(int i=1;i<=n;i++)
{
int x;
fin>>x;
node me;
me.val=x;
me.lft=-1;
me.rgt=-1;
t.push_back(me);
q1.push(i-1);
}
nodes=n;
while((int)q1.size()+(int)q2.size()>1)
{
int a=getmin();
int b=getmin();
node me;
me.val=t[a].val+t[b].val;
ans+=me.val;
me.lft=a;
me.rgt=b;
nodes++;
t.push_back(me);
q2.push(nodes-1);
}
fout<<ans<<'\n';
dfs(nodes-1,0,0);
for(int i=0;i<n;i++)
fout<<lg[i]<<' '<<sol[i]<<'\n';
return 0;
}