Pagini recente » Cod sursa (job #821128) | Cod sursa (job #3257409) | Cod sursa (job #1155952) | Cod sursa (job #2298600) | Cod sursa (job #1166329)
#include <cstdio>
#include <algorithm>
using namespace std;
int N;
int C[2][2000002], nodnow;
long long val[2000002], lg[2000002], bs[2000002];
int whn[2000002][2];
int pbeg[2], pend[2];
long long lgnow, bsnow;
void Dfs(int nodnow)
{
if (nodnow <= N)
{
lg[nodnow] = lgnow;
bs[nodnow] = bsnow;
return;
}
++lgnow;
bsnow = bsnow * 2;
Dfs(whn[nodnow][0]);
bsnow = bsnow + 1;
Dfs(whn[nodnow][1]);
bsnow = bsnow / 2;
--lgnow;
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
scanf("%d", &N);
for (int i = 1; i <= N; ++i)
{
scanf("%lld", &val[i]);
C[0][i] = i;
}
pbeg[0] = 1;
pend[0] = N;
pbeg[1] = 1;
pend[1] = 0;
nodnow = N;
while (pend[0] - pbeg[0] + pend[1] - pbeg[1] + 2 >= 2)
{
++nodnow;
for (int i = 0; i < 2; ++i)
{
int now = -1, wh;
for (int j = 0; j < 2; ++j)
if (pbeg[j] <= pend[j] && (now == -1 || val[C[j][pbeg[j]]] < val[now]))
{
now = C[j][pbeg[j]];
wh = j;
}
++pbeg[wh];
val[nodnow] += val[now];
whn[nodnow][i] = now;
}
C[1][++pend[1]] = nodnow;
}
Dfs(nodnow);
long long result = 0;
for (int i = 1; i <= N; ++i)
result += val[i] * lg[i];
printf("%lld\n", result);
for (int i = 1; i <= N; ++i)
printf("%lld %lld\n", lg[i], bs[i]);
}