Pagini recente » Cod sursa (job #64969) | Cod sursa (job #1690966) | Cod sursa (job #2816658) | Cod sursa (job #2909098) | Cod sursa (job #430151)
Cod sursa(job #430151)
#include<stdio.h>
#define Nmax 1000010
struct Arb { int cost,st,dr;} A[Nmax<<1];
int n,i,nod1,nod2,Q1[Nmax],Q2[Nmax],R,p,u,L[Nmax];
long long Sum, Cod[Nmax];
void add()
{
R++;
A[R].cost = A[nod1].cost + A[nod2].cost;
A[R].st=nod1;
A[R].dr=nod2;
Sum+=A[R].cost;
}
void dfs (int nod, long long cod, int mSize)
{
if(A[nod].st==0)
{
L[nod]=mSize;
Cod[nod]=cod;
return;
}
dfs(A[nod].st,cod<<1,mSize+1);
dfs(A[nod].dr,(cod<<1)+1,mSize+1);
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&A[i].cost);
Q1[i]=i;
}
if(n==1) {printf("0\n1 0"); return 0;}
R=n;
nod1=1; nod2=2;
add();
i=3; Q2[1]=R; p=u=1;
while(i<=n)
{
nod1=Q1[i];
nod2=Q2[p];
if(i+1<=n && A[Q1[i+1]].cost < A[nod2].cost)
{
nod2=Q1[i+1];
i+=2;
}
else if(p+1<=u && A[Q2[p+1]].cost < A[nod1].cost)
{
nod1=Q2[p+1];
p+=2;
}
else i++,p++;
add();
Q2[++u]=R;
}
while(p!=u)
{
nod1=Q2[p];
nod2=Q2[p+1];
p+=2;
add();
Q2[++u]=R;
}
dfs(R,0,0);
printf("%lld\n",Sum);
for(i=1;i<=n;i++)
printf("%d %lld\n",L[i],Cod[i]);
return 0;
}