Pagini recente » Borderou de evaluare (job #2681315) | Cod sursa (job #3333446)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("huffman.in");
ofstream cout("huffman.out");
const int NMAX = 1000005;
long long v[2 * NMAX];
int l[2 * NMAX], r[2 * NMAX];
int len[NMAX];
unsigned long long code[NMAX];
int n;
void dfs(int node, int currLen, unsigned long long currCode) {
if (node < n) {
len[node] = currLen;
code[node] = currCode;
return;
}
dfs(l[node], currLen + 1, currCode << 1);
dfs(r[node], currLen + 1, (currCode << 1) | 1);
}
int main() {
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> v[i];
}
int p1 = 0, p2 = n;
long long ans = 0;
for (int i = 0; i < n - 1; ++i) {
int x, y;
if (p1 < n && (p2 == n + i || v[p1] <= v[p2])) {
x = p1++;
} else {
x = p2++;
}
if (p1 < n && (p2 == n + i || v[p1] <= v[p2])) {
y = p1++;
} else {
y = p2++;
}
int newNode = n + i;
v[newNode] = v[x] + v[y];
l[newNode] = x;
r[newNode] = y;
ans += v[newNode];
}
cout << ans << '\n';
dfs(2 * n - 2, 0, 0);
for (int i = 0; i < n; ++i) {
cout << len[i] << " " << code[i] << '\n';
}
return 0;
}