Pagini recente » Cod sursa (job #1887821) | Cod sursa (job #1755683) | Statistici Tigau Ana-Maria (ANA-MARIA.TIGAU) | Cod sursa (job #1296328) | Cod sursa (job #1222897)
#include<fstream>
using namespace std;
#define NMAX 1000005
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int f[NMAX<<1][2];
int n,k,n1,n2,x1,x2,B[NMAX];
long long lg,C[NMAX],U[NMAX<<1];
void dfs(int nod, int x, long long y)
{
if (nod<=n)
B[nod]=x, C[nod]=y;
else
{
dfs(f[nod][0],x+1,y<<1);
dfs(f[nod][1],x+1,(y<<1)+1);
}
}
int main()
{
int i;
fin>>n;
for (i=1;i<=n;++i)
fin>>U[i];
U[n+1]=U[1]+U[2];
f[n+1][0]=1, f[n+1][1]=2;
lg=U[n+1];
n1=3, n2=n+1;
for (k=n+2;k<2*n;++k)
{
if (n2>=k)
{
U[k]=U[n1]+U[n1+1];
f[k][0]=n1, f[k][1]=n1+1;
n1+=2;
}
else
{
if (n1>n)
{
U[k]=U[n2]+U[n2+1];
f[k][0]=n2, f[k][1]=n2+1;
n2+=2;
}
else
{
x1=n1, x2=n2;
if (U[n1]+U[n1+1]<U[x1]+U[x2] && n1<n)
x1=n1, x2=n1+1;
if (U[n2]+U[n2+1]<U[x1]+U[x2] && n2<k-1)
x1=n2, x2=n2+1;
U[k]=U[x1]+U[x2];
f[k][0]=x1, f[k][1]=x2;
if (x1<n2) ++n1;
else ++n2;
if (x2<n2) ++n1;
else ++n2;
}
}
lg+=U[k];
}
fout<<lg<<"\n";
dfs(2*n-1,0,0);
for (i=1;i<=n;++i)
fout<<B[i]<<" "<<C[i]<<"\n";
return 0;
}