Pagini recente » Cod sursa (job #3191467) | Cod sursa (job #261754) | Cod sursa (job #157617) | Cod sursa (job #2235736) | Cod sursa (job #1434566)
#include<stdio.h>
using namespace std;
#define nmax 1000001
int d[2][nmax],st[2],f[2];
long long rez=0;
long long c[nmax],nv[nmax];
struct nod
{
long long v;
long l,r;
};
nod h[nmax*2];
int n;
FILE *in,*out;
void bf(int poz,long long put,int nivel)
{
if(h[poz].l)
{
bf(h[poz].l,put*2,nivel+1);
bf(h[poz].r,put*2+1,nivel+1);
return;
}
c[poz]=put;
nv[poz]=nivel;
}
void rezolva()
{
int k=n;
st[0]=1;st[1]=1;
f[0]=n;f[1]=0;
int c[2];
int j;
while(f[0]-st[0]>=0 || f[1]-st[1]>0)
{
int p=0;
++k;
for(j=0;j<2;j++)
{
if(!(f[0]-st[0]>=0))
p=1;
else if(!(f[1]-st[1]>=0))
p=0;
else
p=(d[0][st[0]]<d[1][st[1]]) ? 0 : 1;
c[j]=st[p]+ n*p;
st[p]++;
}
h[k].l=c[0];
h[k].r=c[1];
h[k].v=h[c[0]].v + h[c[1]].v;
rez+=h[k].v;
d[1][++f[1]]=h[k].v;
}
bf(k,0,0);
}
int main()
{
in=fopen("huffman.in","r");
out=fopen("huffman.out","w");
fscanf(in,"%lld",&n);
for(int i=1;i<=n;i++)
{
fscanf(in,"%d",&h[i].v);
d[0][i]=h[i].v;
}
rezolva();
fprintf(out,"%lld \n",rez);
for(int i=1;i<=n;i++)
fprintf(out,"%lld %lld \n",nv[i],c[i]);
return 0;
}