Pagini recente » Cod sursa (job #2880633) | Cod sursa (job #1996242) | Cod sursa (job #2115214) | Cod sursa (job #1602446) | Cod sursa (job #398352)
Cod sursa(job #398352)
#include <stdio.h>
#include <deque>
#define N 1000001
using namespace std;
int w[N],n;
long long int cod[N];
long long int niv[N];
struct nod
{int st,dr;
long long int w;
nod (int a,int b,int c)
{st=a;
dr=b;
w=c;
}
nod(){}
}t[2*N];
void df(int poz,int c,int nivel)
{cod[poz]=c;
niv[poz]=nivel;
if(poz>n)
{df(t[poz].st,(c<<1),nivel+1);
df(t[poz].dr,(c<<1)+1,nivel+1);
}
}
int main ()
{freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
int i,a,b,min;
scanf("%d",&n);
deque<int> qi;
deque<int> qo;
for (i=1;i<=n;i++)
{scanf("%d",&w[i]);
t[i]=nod(0,0,w[i]);
qi.push_back(i);
}
while(qi.size()+qo.size()>1)
{if(!qi.empty()&&!qo.empty())
{if(t[qi.front()].w<t[qo.front()].w)
{a=qi.front();qi.pop_front();
}
else
{a=qo.front();qo.pop_front();
}
}
else if(!qi.empty())
{a=qi.front();qi.pop_front();
}
else if(!qo.empty())
{a=qo.front();qo.pop_front();
}
if(!qi.empty()&&!qo.empty())
{if(t[qi.front()].w<t[qo.front()].w)
{b=qi.front();qi.pop_front();
}
else
{b=qo.front();qo.pop_front();
}
}
else if(!qi.empty())
{b=qi.front();qi.pop_front();
}
else if(!qo.empty())
{b=qo.front();qo.pop_front();
}
t[i]=nod(a,b,t[a].w+t[b].w);
qo.push_back(i);
i++;
}
i--;
df(i,0,0);
long long int s=0;
for (i=1;i<=n;i++)
{s+=w[i]*niv[i];
}
printf("%lld\n",s);
for (i=1;i<=n;i++)
{printf("%lld %lld\n",niv[i],cod[i]);
}
return 0;
}