Pagini recente » Cod sursa (job #1732155) | Cod sursa (job #1752831) | Cod sursa (job #1018719) | Cod sursa (job #2279213) | Cod sursa (job #2761432)
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;
const int N = (int) 2e6 + 7;
int n, k1[N], k2[N], len[N];
ll num[N];
priority_queue<pair<int, int>> pq;
void build(int a) {
if (k1[a]) {
len[k1[a]] = len[k2[a]] = 1 + len[a];
num[k1[a]] = num[a];
num[k2[a]] = num[a] + (1LL << len[a]);
build(k1[a]);
build(k2[a]);
}
}
signed main() {
freopen ("huffman.in", "r", stdin);
freopen ("huffman.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
pq.push({-x, i});
}
int y = n;
ll sol = 0;
while ((int) pq.size() > 1) {
auto it1 = pq.top(); pq.pop();
auto it2 = pq.top(); pq.pop();
k1[++y] = it1.second;
k2[y] = it2.second;
pq.push({it1.first + it2.first, y});
sol -= (it1.first + it2.first);
}
printf("%lld\n", sol);
build(y);
for (int i = 1; i <= n; i++) {
printf("%d %lld\n", len[i], num[i]);
}
return 0;
}