Pagini recente » Cod sursa (job #946790) | Cod sursa (job #2852249) | Cod sursa (job #3186043) | Cod sursa (job #2960211) | Cod sursa (job #383871)
Cod sursa(job #383871)
#include <cstdio>
#include <vector>
using namespace std;
#define Nmax 1000010
struct nod {
long long f;
int st, dr;
} H[Nmax * 2];
int n, i, j, m, lg;
int LG[Nmax];
int v[Nmax], Q[Nmax], B[Nmax];
void dfs (int nod, int lg, int b) {
if (H[nod].f) {LG[nod] = lg; B[nod] = b; return ;}
dfs (H[nod].st, lg + 1, b << 1);
dfs (H[nod].dr, lg + 1, (b << 1) + 1);
}
void rezolva () {
for (i = 1, j = 1; i <= n || j <= m; )
if ( i <= n && ( j > m || v[i] <= Q[j])) {
i++; if (i > n && j > m) break;
if ( i <= n && ( j > m || v[i] <= Q[j])) {
Q[++m] = v[i-1] + v[i];
H[m + n].st = i-1; H[m + n].dr = i; H[m + n].f = 0;
i++; lg+= Q[m];
}
else {
Q[++m] = v[i-1] + Q[j];
H[m + n].st = i-1; H[m + n].dr = j + n; H[m + n].f = 0;
j++; lg+= Q[m];
}
}
else {
j++; if (i > n && j > m) break;
if ( i <= n && ( j > m || v[i] <= Q[j])) {
Q[++m] = Q[j-1] + v[i];
H[m + n].st = j - 1 + n; H[m + n].dr = i; H[m + n].f = 0;
i++; lg+= Q[m];
}
else {
Q[++m] = Q[j-1] + Q[j];
H[m + n].st = j - 1 + n; H[m + n].dr = j + n; H[m + n].f = 0;
j++; lg+= Q[m];
}
}
dfs (n + m, 0, 0);
}
int main () {
freopen ("huffman.in", "r", stdin);
freopen ("huffman.out", "w", stdout);
scanf ("%d", &n);
for (i = 1; i <= n; i++) {
scanf ("%d", &v[i]);
H[i].f = v[i];
}
rezolva ();
printf ("%d\n", lg);
for (i = 1; i <= n; i++)
printf ("%d %d\n", LG[i], B[i]);
return 0;
}