Pagini recente » Cod sursa (job #2481412) | Cod sursa (job #2753251) | Cod sursa (job #1080808) | Cod sursa (job #1934264) | Cod sursa (job #1214270)
#include <fstream>
#define INF 1LL * 1000000000 * 1000000000
#define DIMN 1000001
using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");
int n, poz;
struct huff {
long long val;
int fii[2];
} v[DIMN<<1];
long long Cod[DIMN], Min, sol;
int l[DIMN], p[DIMN], u[DIMN], q[2][DIMN];
void DFS (int nod, int niv, long long cod) {
if (v[nod].fii[0] != 0) {
DFS (v[nod].fii[0], niv+1, cod*2);
DFS (v[nod].fii[1], niv+1, cod*2+1);
return;
}
l[nod] = niv;
Cod[nod] = cod;
}
int main () {
f >> n;
for (int i=1; i<=n; ++i) {
f >> v[i].val;
q[0][i] = i;
}
int nn = n;
p[0] = p[1] = 1;
u[0] = n;
while (p[0] + p[1] <= u[0] + u[1]) {
++n;
for (int i=0; i<=1; ++i) {
Min = INF;
for (int j=0; j<=1; ++j)
if (p[j] <= u[j] && Min > v[q[j][p[j]]].val) {
Min = v[q[j][p[j]]].val;
poz = j;
}
v[n].val += Min;
v[n].fii[i] = q[poz][p[poz]];
++p[poz];
}
sol += v[n].val;
q[1][++u[1]] = n;
}
DFS (n, 0, 0);
g << sol << "\n";
for (int i=1; i<=nn; ++i)
g << l[i] << " " << Cod[i] << "\n";
return 0;
}