Pagini recente » Cod sursa (job #2136792) | Cod sursa (job #1593715) | Cod sursa (job #2687099) | Cod sursa (job #2649325) | Cod sursa (job #2845487)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e6;
int father[2 * NMAX + 1];
int value[2 * NMAX + 1];
int v[NMAX + 1];
long long x[2 * NMAX + 1];
int siz[2 * NMAX + 1];
int j;
void b( int i ) {
if ( i == j || siz[i] > 0 )
return;
b( father[i] );
x[i] = 2 * x[father[i]] + value[i];
siz[i] = siz[father[i]] + 1;
}
queue <pair<long long, int>> q;
int st, dr;
pair<long long, int> minim() {
pair<long long, int> a;
if ( st == dr ) {
a = q.front();
q.pop();
} else if ( q.size() == 0 ) {
a = { x[st], siz[st] };
st ++;
} else {
if ( x[st] < q.front().first ) {
a = { x[st], siz[st] };
st ++;
} else {
a = q.front();
q.pop();
}
}
return a;
}
int main() {
ifstream fin( "huffman.in" );
ofstream fout( "huffman.out" );
int n, i;
fin >> n;
for ( i = 0; i < n; i ++ ) {
fin >> v[i];
q.push( { v[i], i } );
}
j = n;
i = 0;
while ( q.size() + (dr - st) > 1 ) {
while ( ( i == 0 && q.size() > 0 ) || ( i == 1 && dr > st ) ) {
pair<long long, int> a = minim();
pair<long long, int> b = minim();
father[a.second] = father[b.second] = j;
value[a.second] = 0, value[b.second] = 1;
if ( i == 0 ) {
x[dr] = a.first + b.first;
siz[dr] = j;
dr ++;
} else
q.push( {a.first + b.first, j} );
j ++;
}
i = !i;
}
for ( i = 0; i <= 2 * n; i ++ )
siz[i] = x[i] = 0;
j --;
long long lg = 0;
for ( i = 0; i < n; i ++ ) {
b(i);
lg += 1LL * siz[i] * v[i];
}
fout << lg << '\n';
for ( i = 0; i < n; i ++ ) {
fout << siz[i] << ' ' << x[i] << '\n';
}
return 0;
}