Pagini recente » Cod sursa (job #2670910) | Cod sursa (job #806728) | Cod sursa (job #1677256) | Istoria paginii runda/luca_oji2 | Cod sursa (job #1238911)
#include <cstdio>
#define tip long long
using namespace std;
struct huffman
{
huffman *l,*r;
tip val;
huffman()
{
l=r=NULL;
val=1000000000000000010;
}
}*huff,*x,*y,*a[2][10000000];
tip n,i,top1,top2,front1,front2,sol,q,aq,sc,lg;
bool poz,ok;
void run(huffman *nod)
{
if(nod->l==NULL)
{
printf("%lld %lld\n",lg,sc);
return;
}
if(nod->l)
{
sc<<=1;
lg++;
run(nod->l);
sc>>=1;lg--;
}
if(nod->r)
{
sc<<=1;
sc++;
lg++;
run(nod->r);
sc>>=1;lg--;
}
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%lld",&n);
for(i=1;i<=n;i++)
{
scanf("%lld",&q);
huff=new huffman;
huff->val=q;
a[0][i]=huff;
}
a[1][1]=new huffman;
top1=n;
front1=front2=top2=1;
poz=1;
while(top1-front1+top2-front2>=2)
{
if(a[poz][front2]==NULL)a[poz][front2]=new huffman;
if(a[!poz][front1]==NULL)a[!poz][front1]=new huffman;
if(a[poz][front2]->val<a[!poz][front1]->val)
x=a[poz][front2++];
else
x=a[!poz][front1++];
if(a[poz][front2]==NULL)a[poz][front2]=new huffman;
if(a[!poz][front1]==NULL)a[!poz][front1]=new huffman;
if(a[poz][front2]->val<a[!poz][front1]->val)
y=a[poz][front2++];
else
y=a[!poz][front1++];
huff=new huffman;
sol+=x->val+y->val;
huff->val=x->val+y->val;
huff->l=x;
huff->r=y;
a[poz][top2++]=huff;
if(top1<front1)
{
aq=top1;
a[!poz][aq]=new huffman;
poz=!poz;
top1=top2;
front1=front2;
top2=front2=aq;
}
}
printf("%lld\n",sol);
run(huff);
return 0;
}