Pagini recente » Cod sursa (job #290718) | Cod sursa (job #771436) | Cod sursa (job #2801183) | Cod sursa (job #181087) | Cod sursa (job #2417166)
#include <bits/stdc++.h>
using namespace std;
queue<pair<long long,int>> qin,qout;
pair<int,long long> ans[1000010];
int st[2000010],dr[2000010],n;
void dfs(int nod,int niv,long long val)
{
if(nod<=n)
{
ans[nod]={niv,val};
return;
}
dfs(st[nod],niv+1,val*2);
dfs(dr[nod],niv+1,val*2+1);
}
const int Buffer=1<<20;
int poz_pars;
char pars[Buffer];
void inc()
{
if(++poz_pars==Buffer)
{
poz_pars=0;
fread(pars,1,Buffer,stdin);
}
}
int read()
{
int s=0;
for(;pars[poz_pars]<'0' or pars[poz_pars]>'9';inc());
for(;pars[poz_pars]>='0' && pars[poz_pars]<='9';inc()) s=s*10+pars[poz_pars]-'0';
return s;
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
fread(pars,1,Buffer,stdin);
int x;
long long sol=0;
n=read();
for(int i=1;i<=n;i++)
{
x=read();
qout.push({x,i});
}
for(int i=1;i<n;i++)
{
pair<long long,int> mn[2];
for(int j=0;j<2;j++)
{
if(qin.empty())
{
mn[j]=qout.front();
qout.pop();
}
else if(qout.empty())
{
mn[j]=qin.front();
qin.pop();
}
else if(qin.front().first<qout.front().first)
{
mn[j]=qin.front();
qin.pop();
}
else
{
mn[j]=qout.front();
qout.pop();
}
}
st[i+n]=mn[0].second;
dr[i+n]=mn[1].second;
sol+=mn[0].first+mn[1].first;
qin.push({mn[0].first+mn[1].first,i+n});
}
dfs(2*n-1,0,0);
printf("%lld\n",sol);
for(int i=1;i<=n;i++) printf("%d %lld\n",ans[i].first,ans[i].second);
return 0;
}