Pagini recente » Cod sursa (job #453865) | Cod sursa (job #2773927) | Cod sursa (job #890354) | Cod sursa (job #2367472) | Cod sursa (job #528703)
Cod sursa(job #528703)
#include <algorithm>
#include <queue>
using namespace std;
#define mp make_pair
#define DIM 1000005
#define sc second
#define fs first
pair <long long,pair <int,int> > nod[DIM<<1];
long long lg_total;
queue <int> q1,q2;
long long b[DIM];
int lg[DIM];
int n,m;
void read ()
{
int i;
scanf ("%d",&n);
for (i=1; i<=n; ++i)
{
scanf ("%lld",&nod[i].fs);
q1.push (i);
}
}
void df (int ind,long long cod,int lvl)
{
if (nod[ind].sc.fs && nod[ind].sc.sc)
{
df (nod[ind].sc.fs,cod<<1,lvl+1);
df (nod[ind].sc.sc,(cod<<1)|1,lvl+1);
return ;
}
lg[ind]=lvl; b[ind]=cod;
}
void solve ()
{
int fiu1,fiu2;
long long val;
for (m=n; !q1.empty () || (int)q2.size ()!=1; )
{
val=fiu1=fiu2=0;
if (!q1.empty () && (q2.empty () || nod[q1.front ()].fs<=nod[q2.front ()].fs))
{
val+=nod[q1.front ()].fs;
fiu1=q1.front ();
q1.pop ();
}
else if (!q2.empty ())
{
val+=nod[q2.front ()].fs;
fiu1=q2.front ();
q2.pop ();
}
if (!q1.empty () && (q2.empty () || nod[q1.front ()].fs<=nod[q2.front ()].fs))
{
val+=nod[q1.front ()].fs;
fiu2=q1.front ();
q1.pop ();
}
else if (!q2.empty ())
{
val+=nod[q2.front ()].fs;
fiu2=q2.front ();
q2.pop ();
}
q2.push (++m); lg_total+=val;
nod[m]=mp (val,mp (fiu1,fiu2));
}
df (m,0,0);
}
void print ()
{
int i;
printf ("%lld\n",lg_total);
for (i=1; i<=n; ++i)
printf ("%d %lld\n",lg[i],b[i]);
}
int main ()
{
freopen ("huffman.in","r",stdin);
freopen ("huffman.out","w",stdout);
read ();
solve ();
print ();
return 0;
}