Pagini recente » Cod sursa (job #999536) | Cod sursa (job #2678807) | Cod sursa (job #3232349) | Cod sursa (job #2232628) | Cod sursa (job #484682)
Cod sursa(job #484682)
# include <cstdio>
# include <queue>
using namespace std;
# define FIN "huffman.in"
# define FOUT "huffman.out"
const int MAX_N = 1000005;
struct nod {
int st, dr;
long long value;
} A[MAX_N << 1];
long long total;
queue<int> Q1, Q2;
int N, i, j, cur;
void df(int Nod, long long vl, int depth) {
if (Nod <= N) {
A[Nod].st = depth;
A[Nod].value = vl;
return;
}
df(A[Nod].st, vl << 1, depth + 1);
df(A[Nod].dr, vl << 1 | 1, depth + 1);
}
int main() {
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d", &N);
for (i = 1; i <= N; ++i) {
A[i].st = A[i].dr = 0;
scanf("%lld\n", &A[i].value);
Q1.push(i);
}
int m[2]; cur = N;
for (i = 1; i < N; ++i) {
for (j = 0; j <= 1; ++j) {
if (Q1.empty()) {
m[j] = Q2.front(); Q2.pop();
continue;
}
if (Q2.empty()) {
m[j] = Q1.front(); Q1.pop();
continue;
}
if (A[Q1.front()].value < A[Q2.front()].value) {
m[j] = Q1.front(); Q1.pop();
continue;
}
m[j] = Q2.front(); Q2.pop();
}
A[++cur].value = A[m[0]].value + A[m[1]].value;
A[cur].st = m[0]; A[cur].dr = m[1]; Q2.push(cur);
total += A[cur].value;
}
printf("%lld\n", total);
df(cur, 0, 0);
for (i = 1; i <= N; ++i)
printf("%d %lld\n", A[i].st, A[i].value);
return 0;
}