Pagini recente » Cod sursa (job #182141) | Cod sursa (job #467393) | Cod sursa (job #3293999) | Cod sursa (job #2490653) | Cod sursa (job #1138999)
#include<fstream>
#include<queue>
#include<cstdio>
using namespace std;
int n,m;
struct coduri
{
int l;
long long c;
}s[1000001];
struct nod
{
long long fr;
int f1,f2;
}v[2000001];
long long sol;
queue<int> q1,q2;
//ifstream fin("huffman.in");
//ofstream fout("huffman.out");
void citire()
{
// fin>>n;
freopen("huffman.in","r",stdin);
scanf("%d",&n);
m=n;
for(int i=1;i<=n;i++)
{
//fin>>v[i].fr;
scanf("%lld",&v[i].fr);
q1.push(i);
}
}
void huffman()
{
int nod[2];
while(!q1.empty() || q2.size()>1)
{
for(int i=0;i<=1;i++)
{
if(!q1.empty() && !q2.empty())
{
if(v[q1.front()].fr<v[q2.front()].fr)
{
nod[i]=q1.front();
q1.pop();
}
else
{
nod[i]=q2.front();
q2.pop();
}
}
else
if(!q1.empty())
{
nod[i]=q1.front();
q1.pop();
}
else
{
nod[i]=q2.front();
q2.pop();
}
}
v[++n].fr=v[nod[0]].fr+v[nod[1]].fr;
v[n].f1=nod[0];
v[n].f2=nod[1];
q2.push(n);
}
}
void dfs(int ind,long long cod, int lg)
{
if(v[ind].f1!=0)
{
sol=sol+v[ind].fr;
dfs(v[ind].f1,(cod<<1),lg+1);
dfs(v[ind].f2,(cod<<1)+1,lg+1);
}
else
{
s[ind].l=lg;
s[ind].c=cod;
}
}
int main()
{
citire();
huffman();
dfs(n,0,0);
freopen("huffman.out","w",stdout);
//fout<<sol<<"\n";
printf("%lld\n",sol);
for(int i=1;i<=m;i++)
{
printf("%d %lld\n",s[i].l,s[i].c);
//fout<<s[i].l<<" "<<s[i].c<<"\n";
}
return 0;
}