Pagini recente » Cod sursa (job #1232800) | Cod sursa (job #2795279) | Cod sursa (job #1556729) | Cod sursa (job #1667548) | Cod sursa (job #1073547)
#include <iostream>
#include <fstream>
using namespace std;
#define MaxN 1000100
#define inf (1<<30)
ifstream f ("huffman.in");
ofstream g ("huffman.out");
struct nod
{
long long v;
long x[2];
}nod[2*MaxN];
long n,i,j,k,p, l[2], r[2];
long long q[2][MaxN],lung[MaxN];
long baza[MaxN],minim,lmax;
void depthf (long pos, long long cod, long nivel)
{
if (nod[pos].x[0])
{
depthf(nod[pos].x[0],cod*2,nivel+1);
depthf(nod[pos].x[0],cod*2+1,nivel+1);
return;
}
lung[pos]=nivel;
baza[pos]=cod;
}
void solve()
{
k=n;
l[0]=l[1]=1;
r[0]=n;
while(l[0]+l[1]<=r[0]+r[1])
{
k++;
for (j=0;j<2;j++)
{
p=0;
minim=inf;
for(i=0;i<2;i++)
{
if(nod[q[i][l[i]]].v<minim && l[i]<=r[i])
{
p=i;
minim=nod[q[i][l[i]]].v;
}
}
nod[k].x[j]=q[p][l[p]];
nod[k].v+=nod[q[p][l[p]]].v;
}
lmax+=nod[k].v;
q[1][++r[1]]=k;
}
depthf(k,0,0);
}
int main()
{
f>>n;
for (i=1;i<=n;i++)
{
f>>nod[i].v;
q[0][i]=i;
}
solve();
g<<lmax<<'\n';
for(i=1;i<=n;i++)
g<<lung[i]<<' '<<baza[i]<<'\n';
f.close();
g.close();
return 0;
}