Pagini recente » Cod sursa (job #1312008) | Cod sursa (job #2834565) | Cod sursa (job #271169) | Cod sursa (job #2164617) | Cod sursa (job #2886680)
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const int MAXN = 1e6;
struct Node{
lli v;
int f[2];
Node(lli v = 0) {
this->v = v;
f[0] = -1;
f[1] = -1;
}
};
int n, k;
Node nodes[2 * MAXN];
lli sol;
lli lg[MAXN + 2];
int cnt[MAXN + 2];
void dfs(int k, lli code, int lvl) {
if (k < n) {
lg[k] = code;
cnt[k] = lvl;
}
for (int i = 0; i < 2; ++ i) {
if (nodes[k].f[i] != -1)
dfs(nodes[k].f[i], code * 2 + i, lvl + 1);
}
}
int main() {
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
cin >> n;
for (int i = 0; i < n; ++ i) {
int v;
cin >> nodes[i].v;
}
int le = 0, ri = n;
int st = n, dr = n;
int k = n;
while (le < ri || st + 1 < dr) {
pair<lli, int> minn[2];
for (int i = 0; i < 2; ++ i) {
if (le >= ri) {
minn[i] = {nodes[st].v, st ++};
} else if (st >= dr) {
minn[i] = {nodes[le].v, le ++};
} else {
minn[i] = nodes[le].v <= nodes[st].v ? make_pair(nodes[le].v, le) : make_pair(nodes[st].v, st);
if (nodes[le].v <= nodes[st].v)
++ le;
else
++ st;
}
}
nodes[k ++].v = minn[0].first + minn[1].first;
dr ++;
sol += nodes[k - 1].v;
for (int i = 0; i < 2; ++ i)
nodes[k - 1].f[i] = minn[i].second;
}
dfs(k - 1, 0, 0);
cout << sol << '\n';
for (int i = 0; i < n; ++ i)
cout << cnt[i] << ' ' << lg[i] << '\n';
cout << '\n';
return 0;
}