Pagini recente » Cod sursa (job #856161) | Cod sursa (job #850070) | Cod sursa (job #182772) | Cod sursa (job #764074) | Cod sursa (job #947565)
Cod sursa(job #947565)
#include<fstream>
using namespace std ;
#define maxn 1000001
const long long inf = ( long long ) 1000000000000000000 ;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
struct nod
{
long long val ;
long long fiu[2] ;
};
nod arb[ 2 * maxn ] ;
long long n ;
long 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] )
{
dfs( arb[poz].fiu[0], cod * 2, nivel + 1 ) ;
dfs( arb[poz].fiu[1], cod * 2 + 1, nivel + 1 ) ;
return ;
}
lg[poz] = nivel ;
b[poz] = cod ;
}
void rezolvare()
{
long long unde = n ;
st[0] = st[1] = 1 ;
dr[0] = n ;
while( st[0] + st[1] <= dr[0] + dr[1] )
{
++unde ;
for(int j = 0; j < 2; ++j )
{
long long care = 0 ;
long long minim = inf ;
for(int i = 0; i < 2; ++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[1][ ++dr[1] ] = unde ;
}
dfs( unde, 0, 0 ) ;
}
void citire()
{
fin >> n ;
for(int i = 1; i <= n; ++i )
{
fin >> arb[i].val ;
coada[0][i] = i ;
}
}
void afisare()
{
fout << sol << "\n" ;
for(int i = 1; i <= n; ++i )
fout << lg[i] << " " << b[i] << "\n" ;
}
int main()
{
citire() ;
rezolvare() ;
afisare() ;
return 0 ;
}