Pagini recente » Cod sursa (job #103884) | Cod sursa (job #2694189) | Cod sursa (job #701945) | Cod sursa (job #2829158) | Cod sursa (job #1231196)
#include <cstdio>
#include <queue>
using namespace std;
int N;
long long lgnow, bsnow, result;
long long val[2000002], lg[2000002], bs[2000002];
int V[2000002][2];
queue<int> Qnodinit, Qnod;
void Dfs(int nodnow)
{
if (nodnow <= N)
{
lg[nodnow] = lgnow;
bs[nodnow] = bsnow;
return;
}
++lgnow;
bsnow = bsnow * 2;
Dfs(V[nodnow][0]);
bsnow = bsnow + 1;
Dfs(V[nodnow][1]);
bsnow = bsnow / 2;
--lgnow;
}
void solve()
{
int nodnow = N;
while (!Qnodinit.empty() || !Qnod.empty())
{
++nodnow;
for (int i = 0; i < 2; ++i)
{
int now;
if (Qnodinit.empty())
{
now = Qnod.front();
Qnod.pop();
}
else if (Qnod.empty())
{
now = Qnodinit.front();
Qnodinit.pop();
}
else if (val[Qnodinit.front()] <= val[Qnod.front()])
{
now = Qnodinit.front();
Qnodinit.pop();
}
else
{
now = Qnod.front();
Qnod.pop();
}
V[nodnow][i] = now;
val[nodnow] += val[now];
}
if (!Qnod.empty()) Qnod.push(nodnow);
else if (Qnod.empty() && !Qnodinit.empty()) Qnod.push(nodnow);
}
Dfs(nodnow);
}
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]);
Qnodinit.push(i);
}
solve();
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]);
return 0;
}