Pagini recente » Cod sursa (job #2048937) | Cod sursa (job #1486642) | Cod sursa (job #1848604) | Cod sursa (job #348680) | Cod sursa (job #1193074)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
#define MAX 1000005
struct node{
long long val;
int st, dr;
};
node *p;
node nod[2*MAX];
int Q1[MAX], Q2[MAX], st1, dr1, st2, dr2;
int n, i, x;
int take_min()
{
int x;
if(st1>=dr1)
{
x=Q2[st2];
st2++;
return x;
}
if(st2>=dr2)
{
x=Q1[st1];
st1++;
return x;
}
if(nod[Q2[st2]].val<nod[Q1[st1]].val)
{
x=Q2[st2];
st2++;
return x;
}
x=Q1[st1];
st1++;
return x;
}
long long nr;
int lg;
int ln[MAX];
long long number[MAX];
void df(int rad)
{
if(!nod[rad].st)
{
ln[rad]=lg;
number[rad]=nr;
return;
}
lg++;
nr*=2;
df(nod[rad].st);
nr++;
df(nod[rad].dr);
nr/=2;
lg--;
}
int main()
{
int d=0;
fin>>n;
for(i=1;i<=n;i++)
{
++d;
fin>>x;
nod[d].val=x;
Q1[dr1++]=d;
}
fin.close();
int i1, i2;
long long s=0;
for(i=1;i<n;i++)
{
i1=take_min();
i2=take_min();
d++;
nod[d].val=nod[i1].val+nod[i2].val;
nod[d].st=i1;
nod[d].dr=i2;
s+=nod[d].val;
Q2[dr2++]=d;
}
df(d);
fout<<s<<"\n";
for(i=1;i<=n;i++)
{
fout<<ln[i]<<" "<<number[i]<<"\n";
}
fout.close();
}