Pagini recente » Cod sursa (job #523244) | Cod sursa (job #1585292) | Cod sursa (job #576973) | Cod sursa (job #3217411) | Cod sursa (job #2734537)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 10;
struct Node {
int id;
long long sum;
int l, r;
bool operator<(Node q) const {
return -sum < -q.sum;
}
} H[maxn];
int e = 1;
long long val[maxn];
int dist[maxn];
vector<pair<int, long long>> res;
void bfs(int src) {
val[src] = dist[src] = 0;
queue<int> Q;
Q.push(src);
while (!Q.empty()) {
int q = Q.front(); Q.pop();
for (int v : {H[q].l, H[q].r}) {
if (v) {
dist[v] = dist[q] + 1;
val[v] = val[q] * 2 + (v == H[q].r);
Q.push(v);
}
}
}
}
int main() {
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
int n;
scanf("%d", &n);
priority_queue<Node> pq;
for (int i = 0; i < n; ++i) {
int x;
scanf("%d", &x);
H[e] = {e, x, 0, 0};
pq.push(H[e++]);
}
while (pq.size() > 1) {
auto a = pq.top(); pq.pop();
auto b = pq.top(); pq.pop();
H[e] = {e, a.sum + b.sum, a.id, b.id};
pq.push(H[e++]);
}
int root = pq.top().id;
bfs(root);
long long ans = 0;
for (int i = 1; i <= n; ++i) ans += dist[i] *1ll * H[i].sum;
printf("%lld\n", ans);
for (int i = 1; i <= n; ++i) {
printf("%d %lld\n", dist[i], val[i]);
}
return 0;
}