Pagini recente » Cod sursa (job #697900) | Cod sursa (job #1730216) | Cod sursa (job #2896566) | Cod sursa (job #1025665) | Cod sursa (job #1162045)
#include<cstdio>
#include<queue>
#define inf 1LL*1000000000*1000000000
#define NMax 1000100
using namespace std;
struct tip { long long val;
int fiu[2]; } nod[NMax];
int Lg[NMax];
long long C[NMax];
queue<int> Q[2];
void DF (int crt, long long cod, int nivel)
{
if (nod[crt].fiu[0])
{
DF(nod[crt].fiu[0],2*cod,nivel+1);
DF(nod[crt].fiu[1],2*cod+1,nivel+1);
return;
}
C[crt]=cod;
Lg[crt]=nivel;
}
int main ()
{
int N,Nr=0,i,coada,which,elem;
long long LgT=0,Min;
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&N);
for (i=1; i<=N; i++)
{
scanf("%lld",&nod[++Nr].val);
Q[0].push(i);
}
while (Q[0].size() + Q[1].size() >1)
{
Nr++;
for (elem=0; elem<2; elem++)
{
which=0, Min=inf;
for (coada=0; coada<2; coada++)
if (!Q[coada].empty())
if (nod[Q[coada].front()].val<Min)
Min=nod[Q[coada].front()].val, which=coada;
nod[Nr].fiu[elem]=Q[which].front();
nod[Nr].val+=Min;
Q[which].pop();
}
LgT+=nod[Nr].val;
Q[1].push(Nr);
}
DF(Nr,0,0);
printf("%lld\n",LgT);
for (i=1; i<=N; i++)
printf("%d %lld\n",Lg[i],C[i]);
return 0;
}