Pagini recente » Cod sursa (job #266695) | Cod sursa (job #2076050) | Cod sursa (job #48948) | Cod sursa (job #52844) | Cod sursa (job #1243591)
#include <cstdio>
const long long inf = 1LL*1000000000*100000000;
const long long NMAX = 1000100;
using namespace std;
struct noduri
{
long long v;
int f[2];
};
noduri nod[2*NMAX];
int N,q[2][NMAX];
long long sol,b[NMAX],lg[NMAX],l[2],r[2];
void dfs(int poz, long long cod, long long nivel)
{
if (nod[poz].f[0])
{
dfs(nod[poz].f[0], cod*2, nivel+1);
dfs(nod[poz].f[1], cod*2 + 1, nivel+1);
return;
}
lg[poz] = nivel;
b[poz] = cod;
}
void solve()
{
long long m = inf;
long long p = 0;
long long k = N;
l[0]=l[1]=1;
r[0]=N;
while(l[0] + l[1] <= r[0] + r[1])
{
k++;
for (int i = 0; i < 2; ++i)
{
m = inf;
p = 0;
for (int j = 0; j < 2; ++j)
{
if (nod[q[j][l[j]]].v < m && l[j]<=r[j])
{
m = nod[q[j][l[j]]].v;
p = j;
}
}
nod[k].f[i] = q[p][l[p]];
nod[k].v += nod[q[p][l[p]]].v;
l[p]++;
}
sol += nod[k].v;
q[1][++r[1]] = k;
}
dfs(k,0,0);
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
scanf("%d", &N);
for (int i = 1; i <= N; ++i)
{
scanf("%lld", &nod[i].v);
q[0][i] = i;
}
solve();
printf("%lld\n", sol);
for (int i = 1; i <= N; ++i)
{
printf("%lld %lld\n", lg[i], b[i]);
}
return 0;
}