Pagini recente » Cod sursa (job #3179398) | Cod sursa (job #2358485) | Cod sursa (job #656408) | Cod sursa (job #2603029) | Cod sursa (job #1165242)
#include<cstdio>
#include<queue>
#define Inf 1LL*1000000000*1000000000
#define Nmax 1000010
#define LL long long
using namespace std;
struct Arb{
Arb *stg, *drp;
int val;
int crt;
Arb()
{
stg = drp = NULL;
val = 0;
crt = 0;
}
};
LL N, i, Nrcrt, sol[Nmax][2], lgT;
queue<LL>Q1;
queue<Arb*>Q2;
void solve()
{
while (Q1.size() + Q2.size() > 1)
{
Arb *p = new Arb;
for (i = 1; i <= 2; ++i)
{
LL comp1, comp2;
if (Q1.empty())
comp1 = Inf;
else
comp1 = Q1.front();
if (Q2.empty())
comp2 = Inf;
else
comp2 = Q2.front()->val;
if (comp1 < comp2)
{
Arb *s = new Arb;
Nrcrt++;
s->crt = Nrcrt;
p->val += Q1.front();
Q1.pop();
i == 1 ? p->stg = s : p->drp = s;
}
else
{
p->val += Q2.front()->val;
i == 1 ? p->stg = Q2.front() : p->drp = Q2.front();
Q2.pop();
}
}
lgT += p->val;
Q2.push(p);
}
}
void DFS(Arb* R, LL nivel, LL cod)
{
if (R->stg == NULL)
{
sol[R->crt][1] = cod;
sol[R->crt][0] = nivel;
}
else
{
DFS(R->stg, nivel+1, cod*2);
DFS(R->drp, nivel+1, (cod + 1)*2);
}
}
int main()
{
LL a;
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
scanf("%lld", &N);
for (i = 1; i <= N; ++i)
{
scanf("%lld", &a);
Q1.push(a);
}
solve();
Arb *R = new Arb;
R = Q2.front();
DFS(R, 0, 0);
printf("%lld\n", lgT);
for (i = 1; i <= N; ++i)
printf("%lld %lld\n", sol[i][0], sol[i][1]);
return 0;
}