Pagini recente » Diferente pentru onis-2014/solutii-runda-4 intre reviziile 3 si 4 | Monitorul de evaluare | Borderou de evaluare (job #2389224) | Cod sursa (job #2068281)
#include<bits/stdc++.h>
using namespace std;
const int NMAX = 1e6+5;
const long long INF = 1e18+5;
struct noade
{
long long v;
long f[2];
}nod[NMAX<<1];
long n , i , j , k , p , l[2] , r[2] , q[2][NMAX] , lg[NMAX];
long long b[NMAX] , m , sol;
inline void df(long poz , long long cod , long nivel)
{
if(nod[poz].f[0])
{
df(nod[poz].f[0] , (cod<<1) , nivel+1);
df(nod[poz].f[1] , (cod<<1|1) , nivel+1);
return;
}
lg[poz] = nivel;
b[poz] = cod;
}
inline void go()
{
k = n;
l[0] = l[1] = 1;
r[0] = n;
while(l[0] + l[1] <= r[1] + r[0])
{
++k;
for(j = 0 ; j < 2; ++j)
{
p = 0;
m = INF;
for(i = 0 ; i < 2; ++i)
{
if(nod[ q[i][ l[i] ] ].v < m && l[i] <= r[i])
{
p=i;
m = nod[ q[i][ l[i] ] ].v;
}
}
nod[k].f[j] = q[p][ l[p] ];
nod[k].v += nod[ q[p][ l[p] ] ].v;
l[p]++;
}
sol += nod[k].v;
q[1][ ++r[1] ] = k;
}
df(k , 0 , 0);
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&nod[i].v);
q[0][i] = i;
}
go();
printf("%lld\n",sol);
for(i=1;i<=n;++i)
printf("%d %lld\n",lg[i],b[i]);
return 0;
}