Pagini recente » Cod sursa (job #345440) | Cod sursa (job #1493204) | Cod sursa (job #1339521) | Cod sursa (job #82619) | Cod sursa (job #374404)
Cod sursa(job #374404)
#include<stdio.h>
#include<stdlib.h>
#define N 1000010
const long long inf=1LL<<62;
struct Nod
{
long long v;
int f[2];
};
Nod nod[N<<1];
int n;
int p[2];
int u[2];
int q[2][N];
long long lsol;
int lb[N];
long long b[N];
inline void citire()
{
scanf("%d",&n);
for(int i=1; i<=n; ++i)
{
scanf("%lld",&nod[i].v);
q[0][i]=i;
}
}
void dfs(int poz,long long cod,int niv)
{
if(nod[poz].f[0]!=0)
{
dfs(nod[poz].f[0],cod<<1,niv+1);
dfs(nod[poz].f[1],(cod<<1)+1,niv+1);
return;
}
lb[poz]=niv;
b[poz]=cod;
}
inline void rezolva()
{
p[0]=p[1]=1;
u[0]=n;
u[1]=0;
long long val;
int cc;
int k=n;
while(p[0]<=u[0] || p[1]<u[1])
{
++k;
for(int i=0; i<2; ++i)
{
val=inf;
//cc=-1;
for(int j=0; j<2; ++j)
{
if(p[j]<=u[j] && nod[q[j][p[j]]].v<val)
{
val=nod[q[j][p[j]]].v;
cc=j;
}
}
if(cc==-1)
exit(4);
nod[k].v+=val;
nod[k].f[i]=q[cc][p[cc]];
++p[cc];
}
lsol+=nod[k].v;
q[1][++u[1]]=k;
}
dfs(k,0,0);
}
inline void scrie()
{
printf("%lld\n",lsol);
for(int i=1; i<=n; ++i)
printf("%d %lld\n",lb[i],b[i]);
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
citire();
rezolva();
scrie();
return 0;
}