Pagini recente » Cod sursa (job #1935954) | Cod sursa (job #1534768) | Cod sursa (job #1913260) | Cod sursa (job #1362042) | Cod sursa (job #3001409)
#include <bits/stdc++.h>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
int n;
struct node {
node* left;
node* right;
int val;
int freq;
node(node* _left, node *_right, int _val, int _freq)
: left(_left),
right(_right),
val(_val),
freq(_freq) {}
~node() {
if (left) delete[] left;
left = nullptr;
if (right) delete[] right;
right = nullptr;
}
};
queue<node*> q[2];
long long lgmin;
pair<long long, long long> ans[1000005];
void dfs(node *nod, long long curr, long long dist) {
if (nod->val != 0) {
ans[nod->val] = make_pair(dist, curr);
lgmin += dist * nod->freq;
return;
}
dfs(nod->left, curr * 2, dist + 1);
dfs(nod->right, curr * 2 + 1, dist + 1);
}
int main() {
in>>n;
long long x;
for (int i = 1; i <= n; i++) {
in>>x;
q[0].push(new node(nullptr, nullptr, i, x));
}
int care = 1;
// q[care] - coada in care bag
// q[care ^ 1] - coada din care bag
do {
while (!q[care ^ 1].empty()) {
node* unu = q[care ^ 1].front();
q[care ^ 1].pop();
if (q[care].empty() || (!q[care ^ 1].empty() && (q[care ^ 1].front()->freq < q[care].front()->freq))) {
node* doi = q[care ^ 1].front();
q[care ^ 1].pop();
q[care].push(new node(unu, doi, 0LL, unu->freq + doi->freq));
} else {
node* doi = q[care].front();
q[care].pop();
q[care].push(new node(unu, doi, 0LL, unu->freq + doi->freq));
}
}
care = care ^ 1;
} while (q[care ^ 1].size() != 1);
dfs(q[care ^ 1].front(), 0, 0);
out<<lgmin<<'\n';
for (int i = 1; i <= n; i++) {
out<<ans[i].first<<" "<<ans[i].second<<'\n';
}
}