Pagini recente » Cod sursa (job #726449) | Cod sursa (job #1732022) | Cod sursa (job #1588875) | Cod sursa (job #1740136) | Cod sursa (job #952619)
Cod sursa(job #952619)
#include<cstdio>
using namespace std ;
#define maxn 1000001
#define baza 2
const long long inf = ( long long ) 1000000000000000000 ;
struct nod
{
long long val ;
long fiu[baza] ;
};
nod arb[ 2 * maxn ] ;
long n ;
long coada[2][maxn], st[2], dr[2], lg[maxn] ;
long long b[maxn], sol ;
void dfs(long long poz, long long cod, long long nivel)
{
if( arb[poz].fiu[0] )
{
for(int i = 0; i < baza; ++i )
{
long long cod_nou = cod * baza + i ;
dfs( arb[poz].fiu[i], cod_nou, nivel + 1 ) ;
}
return ;
}
lg[poz] = nivel ;
b[poz] = cod ;
}
void rezolvare()
{
long unde = n ;
long long S = baza ;
long long D = n ;
for(int i = 0; i < baza; ++i )
st[i] = 1 ;
dr[0] = n ;
while( S <= D )
{
++unde ;
for(int j = 0; j < baza; ++j )
{
long care = 0 ;
long long minim = inf ;
for(int i = 0; i < baza; ++i )
{
if( arb[ coada[i][ st[i] ] ].val < minim && st[i] <= dr[i] )
{
care = i ;
minim = arb[ coada[i][ st[i] ] ].val ;
}
}
arb[unde].fiu[j] = coada[care][ st[care] ] ;
arb[unde].val += arb[ coada[care][ st[care] ] ].val ;
++st[care] ;
}
sol += arb[unde].val ;
coada[ baza - 1 ][ ++dr[ baza - 1 ] ] = unde ;
S += baza ;
++D ;
}
dfs( unde, 0, 0 ) ;
}
void citire()
{
freopen("huffman.in", "r", stdin);
scanf("%d", &n);
for(int i = 1; i <= n; ++i )
{
scanf("%d", &arb[i].val);
coada[0][i] = i ;
}
}
void afisare()
{
freopen("huffman.out", "w", stdout);
printf("%lld\n", sol);
for(int i = 1; i <= n; ++i )
printf("%d %lld\n", lg[i], b[i]);
}
int main()
{
citire() ;
rezolvare() ;
afisare() ;
return 0 ;
}