Pagini recente » Cod sursa (job #3294469) | Cod sursa (job #3297515)
#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<int> left(n, NIL), right(n, NIL);
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] );
left.push_back( a );
right.push_back( b );
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(); i--; ){
if( i < n ) continue;
len[left[i]] = 1 + len[i];
val[left[i]] = 2 * val[i];
len[right[i]] = 1 + len[i];
val[right[i]] = 2 * val[i] + 1;
}
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;
}