Pagini recente » Cod sursa (job #1044606) | Cod sursa (job #1860531) | Cod sursa (job #1105083) | Cod sursa (job #2049742) | Cod sursa (job #976781)
Cod sursa(job #976781)
#include <queue>
#include <cstdio>
using namespace std;
const int N = (int)(1e6+5);
long long v[N*2], sol, cod[N], l[N];
pair <int, int> fiu[N*2];
queue <int> Q1, Q2;
int last, n;
void dfs(int x, long long lv, long long code) {
if (x > n) {
sol += v[x];
dfs(fiu[x].first, lv + 1, code * 2);
dfs(fiu[x].second, lv + 1, code * 2 + 1);
}
else {
l[x] = lv;
cod[x] = code;
}
}
int get_min() {
int MIN;
if (!Q2.size()) {
MIN = Q1.front(); Q1.pop();
return MIN;
}
if (!Q1.size()) {
MIN = Q2.front(); Q2.pop();
return MIN;
}
if (v[Q1.front()] <= v[Q2.front()]) {
MIN = Q1.front(); Q1.pop();
return MIN;
}
MIN = Q2.front(); Q2.pop();
return MIN;
}
int main() {
freopen ("huffman.in", "r", stdin);
freopen ("huffman.out", "w", stdout);
scanf ("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%lld", &v[i]);
Q1.push(i);
}
last = n;
while (Q1.size() + Q2.size() > 1) {
int MIN1 = get_min();
int MIN2 = get_min();
v[++last] = v[MIN1] + v[MIN2];
fiu[last].first = MIN1;
fiu[last].second = MIN2;
Q2.push(last);
}
dfs(last, 0, 0);
printf("%lld\n", sol);
for (int i = 1; i <= n; ++i)
printf ("%lld %lld\n" , l[i], cod[i]);
}