Pagini recente » Cod sursa (job #1621154) | Cod sursa (job #1380930) | Cod sursa (job #368071) | Cod sursa (job #2956507) | Cod sursa (job #2342947)
#include <iostream>
#include <cstdio>
using namespace std;
struct nod
{
long long val;
int poz;
nod *l;
nod *r;
}v[2000011];
nod w[1011111];
int n;
void parc(nod r, int h, int val)
{
// printf("%lld ", r.val);
if(r.l == NULL)
{
w[r.poz].poz = h;
w[r.poz].val = val;
return;
}
parc(*r.l,h + 1, val<<1);
parc(*r.r, h + 1, ((val<<1) + 1));
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
int i, s, f, sw = 0, fw = 0, ord, p1, p2;
scanf("%d", &n);
ord = n;
s = n;
f = 2*n;
for(i = n; i < 2*n; i++)
{v[i].poz = i + 1 - n;v[i].r = v[i].l = NULL;scanf("%lld", &(v[i].val));}
long long a, b, su = 0;
while(s != f)
{
ord--;
if(sw != fw)
{
if(v[s].val > w[sw].val)
{ v[ord].l = &w[sw]; a = w[sw++].val;}
else
{ v[ord].l = &v[s];; a = v[s++].val;}
}
else
{ v[ord].l = &v[s];; a = v[s++].val;}
if(sw != fw)
{
if(v[s].val > w[sw].val)
{v[ord].r = &w[sw]; b = w[sw++].val;}
else
{v[ord].r = &v[s]; b = v[s++].val;}
}
else
{v[ord].r = &v[s]; b = v[s++].val;}
v[ord].val = a + b;
su += a+b;
w[fw++] = v[ord];
}
while(sw + 2 <= fw)
{
ord--;
w[fw++].val = w[sw].val + w[sw+1].val;
su += w[fw - 1].val;
w[fw - 1].l = &w[sw];
w[fw - 1].r = &w[sw+1];
sw += 2;
v[ord] = w[fw - 1];
}
parc(v[1],0, 0);
printf("%lld\n", su);
for(i = 1 ;i <= n;i ++)
{
printf("%d %lld\n", w[i].poz, w[i].val);
}
return 0;
}