Pagini recente » Cod sursa (job #779686) | Cod sursa (job #1253786) | Cod sursa (job #1770555) | Cod sursa (job #670860) | Cod sursa (job #2845453)
#include <bits/stdc++.h>
using namespace std;
priority_queue <pair<int, int>> pq;
const int NMAX = 1e6;
int father[2 * NMAX + 1];
int value[2 * NMAX + 1];
int v[NMAX + 1];
int x[2 * NMAX + 1];
int siz[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;
}
int main() {
ifstream fin( "huffman.in" );
ofstream fout( "huffman.out" );
int n, i, a;
fin >> n;
for ( i = 0; i < n; i ++ ) {
fin >> v[i];
pq.push( { -v[i], i } );
}
j = n;
while ( pq.size() > 1 ) {
pair<int, int> x1 = pq.top();
pq.pop();
pair<int, int> x2 = pq.top();
pq.pop();
value[x1.second] = 0;
value[x2.second] = 1;
father[x1.second] = father[x2.second] = j;
pq.push( { x1.first + x2.first, j } );
j ++;
}
j --;
long long lg = 0;
vector <pair<long long, long long>> ans;
for ( i = 0; i < n; i ++ ) {
b(i);
ans.push_back( {siz[i], x[i]} );
lg += 1LL * siz[i] * v[i];
}
fout << lg << '\n';
for ( auto it : ans ) {
fout << it.first << ' ' << it.second << '\n';
}
return 0;
}