Pagini recente » Cod sursa (job #3294466) | Cod sursa (job #3297519)
#pragma GCC optimize("Os")
#include <stdio.h>
#include <vector>
#include <queue>
constexpr int NIL = -1;
using ll = long long;
int main() {
FILE *fin = fopen( "huffman.in", "r" );
FILE *fout = fopen( "huffman.out", "w" );
int n;
fscanf( fin, "%d", &n );
std::vector<ll> v(n);
std::vector<bool> side(n, false);
std::vector<int> par(n, NIL);
v.reserve( 2 * n );
par.reserve( 2 * n );
side.reserve( 2 * n );
for( int i = 0; i < n; i++ )
fscanf( fin, "%lld", &v[i] );
int q1idx = 0;
int q2begin = n, q2end = n;
while( (n - q1idx) + (q2end - q2begin) > 1 ){
int a, b;
if( (q2end == q2begin) || (!(q1idx == n) && v[q1idx] < v[q2begin]) )
a = q1idx++;
else
a = q2begin++;
if( (q2end == q2begin) || (!(q1idx == n) && v[q1idx] < v[q2begin]) )
b = q1idx++;
else
b = q2begin++;
v.push_back( v[a] + v[b] );
par.emplace_back();
side.emplace_back();
par[a] = q2end;
side[a] = false;
par[b] = q2end;
side[b] = true;
q2end++;
}
std::vector<int> len(v.size());
std::vector<ll> val(v.size());
len.back() = 0;
val.back() = 0;
for( int i = (int)v.size() - 1; i--; ){
len[i] = 1 + len[par[i]];
val[i] = 2 * val[par[i]] + side[i];
}
ll ans = 0;
for( int i = 0; i < n; i++ )
ans += len[i] * (ll)v[i];
fprintf( fout, "%lld\n", ans );
for( int i = 0; i < n; i++ )
fprintf( fout, "%d %lld\n", len[i], val[i] );
fclose( fin );
fclose( fout );
return 0;
}