Pagini recente » Cod sursa (job #1541138) | Cod sursa (job #1839759) | Cod sursa (job #1428319) | Cod sursa (job #1541618) | Cod sursa (job #1483766)
#include <stdio.h>
#define MAXN 1000000
int nv[MAXN], nq[MAXN], sv, sq, dq, t[2 * MAXN], ad[2 * MAXN], sole[2 * MAXN], solnr[2 * MAXN];
int n;
long long v[MAXN], q[MAXN];
void dfs(int x, int *et, int *nr){
if(x == 2 * n - 2){
*et = 0;
*nr = 0;
}
else if(sole[x] != 0){
*et = sole[x];
*nr = solnr[x];
}
else{
int et2, nr2;
dfs(t[x], &et2, &nr2);
*et = et2 * 2 + ad[x];
sole[x] = *et;
*nr = nr2 + 1;
solnr[x] = *nr;
}
}
inline void take(long long *x, int *p){
if(sv == n){
*x = q[sq];
*p = nq[sq];
sq++;
}
else if(sq == dq){
*x = v[sv];
*p = nv[sv];
sv++;
}
else{
if(v[sv] > q[sq]){
*x = q[sq];
*p = nq[sq];
sq++;
}
else{
*x = v[sv];
*p = nv[sv];
sv++;
}
}
}
int main(){
FILE *in = fopen("huffman.in", "r");
int i;
fscanf(in, "%d", &n);
for(i = 0; i < n; i++){
fscanf(in, "%lld", &v[i]);
nv[i] = i;
}
fclose(in);
long long sum = 0, x1, x2;
int p1, p2;
for(i = 0; i < n - 1; i++){
take(&x1, &p1);
take(&x2, &p2);
q[dq] = x1 + x2;
sum += q[dq];
nq[dq] = n + i;
t[p1] = t[p2] = nq[dq];
ad[p1] = 0;
ad[p2] = 1;
dq++;
}
FILE *out = fopen("huffman.out", "w");
fprintf(out, "%lld\n", sum);
int poz;
long long et, nr;
for(i = 0; i < n; i++){
poz = i;
et = 0;
nr = 0;
dfs(i, &et, &nr);
fprintf(out, "%lld %lld\n", nr, et);
}
fclose(out);
return 0;
}