Pagini recente » Cod sursa (job #2184181) | Cod sursa (job #908061) | Cod sursa (job #1414329) | Cod sursa (job #1215132) | Cod sursa (job #754269)
Cod sursa(job #754269)
#include <cstdio>
#include <algorithm>
using namespace std;
const int SIZE = 1000002;
int N, F[SIZE];
int Q[2][SIZE], beg[2], end[2];
int nodnow;
long long val[2 * SIZE];
int son[2 * SIZE][2], leng[SIZE];
long long bin[SIZE], result;
void Dfs(int nod, long long val, int len)
{
if (son[nod][0])
{
Dfs(son[nod][0], val * 2, len + 1);
Dfs(son[nod][1], val * 2 + 1, len + 1);
return;
}
leng[nod] = len;
bin[nod] = val;
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
scanf("%d", &N);
beg[0] = 1, end[0] = 0;
for (int i = 1; i <= N; ++i)
{
scanf("%d", &F[i]);
Q[0][++end[0]] = i;
val[i] = F[i];
}
nodnow = N;
beg[1] = 1, end[1] = 0;
int now, where;
while (end[0] + end[1] - beg[0] - beg[1] >= 0)
{
++nodnow;
{
now = -1;
for (int j = 0; j < 2; ++j)
if (beg[j] <= end[j] && (now == -1 || val[now] > val[Q[j][beg[j]]]))
{
now = Q[j][beg[j]];
where = j;
}
++beg[where];
val[nodnow] += val[now];
son[nodnow][0] = now;
}
{
now = -1;
for (int j = 0; j < 2; ++j)
if (beg[j] <= end[j] && (now == -1 || val[now] > val[Q[j][beg[j]]]))
{
now = Q[j][beg[j]];
where = j;
}
++beg[where];
val[nodnow] += val[now];
son[nodnow][1] = now;
}
Q[1][++end[1]] = nodnow;
}
Dfs(nodnow, 0, 0);
for (int i = 1; i <= N; ++i)
result += 1LL * F[i] * leng[i];
printf("%lld\n", result);
for (int i = 1; i <= N; ++i)
printf("%d %lld\n", leng[i], bin[i]);
}