Pagini recente » Borderou de evaluare (job #1691036) | Cod sursa (job #1458037) | Cod sursa (job #2926596) | Cod sursa (job #2835253) | Cod sursa (job #2903337)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin( "huffman.in" );
ofstream fout( "huffman.out" );
const int MAXN = 1e6 + 1;
const long long INF = 1e18 + 1;
struct huffnode {
huffnode( huffnode *left = NULL, huffnode *right = NULL, long long val = INF, int lf = -1 ):
left( left ), right( right ), val( val ), lf( lf ) {}
huffnode *left, *right;
long long val;
int lf;
};
huffnode *root;
queue<huffnode*> init, sums;
huffnode* get() {
huffnode *x;
if ( init.size() == 0 ) {
x = sums.front();
sums.pop();
return x;
}
if ( sums.size() == 0 ) {
x = init.front();
init.pop();
return x;
}
if ( init.front() -> val > sums.front() -> val ) {
x = sums.front();
sums.pop();
} else {
x = init.front();
init.pop();
}
return x;
}
void addNode() {
huffnode *x, *y;
x = get();
y = get();
root = new huffnode( x, y, x -> val + y -> val, -1 );
sums.push( root );
}
long long code[MAXN], len[MAXN];
long long solve( huffnode *node, long long acode, int dep ) {
if ( node -> lf != -1 ) {
code[node -> lf] = acode;
len[node -> lf] = dep;
return 0;
}
return node -> val + solve( node -> left, 2 * acode, dep + 1 ) + solve( node -> right, 2 * acode + 1, dep + 1 );
}
int main() {
int n;
long long f;
fin >> n;
for ( int i = 1; i <= n; ++i ) {
fin >> f;
init.push( new huffnode( NULL, NULL, f, i ) );
}
while ( init.size() + sums.size() > 1 ) {
addNode();
}
fout << solve( root, 0, 0 ) << "\n";
for ( int i = 1; i <= n; ++i ) {
fout << len[i] << " " << code[i] << "\n";
}
fin.close();
fout.close();
return 0;
}