Pagini recente » Cod sursa (job #1943944) | Cod sursa (job #917947) | Cod sursa (job #3332200) | Monitorul de evaluare | Cod sursa (job #2105781)
#include<fstream>
#define DN 1000005
#define INF 100000000000005
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n,q[2][DN],k,l[2],r[2],poz,lg[DN];
long long mi,cod[DN],sol;
struct sdf
{
long long v;
int f[2];
}nod[2*DN];
void ve()
{
k=n;
r[0]=n;
l[0]=l[1]=1;
while(l[0]+l[1]<=r[0]+r[1])
{
k++;
for(int i=0;i<2;i++)
{
mi=INF;
for(int j=0;j<2;j++)
if(l[j]<=r[j]&&nod[q[j][l[j]]].v<=mi)
{
mi=nod[q[j][l[j]]].v;
poz=j;
}
nod[k].f[i]=q[poz][l[poz]];
nod[k].v+=mi;
l[poz]++;
}
r[1]++;
q[1][r[1]]=k;
sol+=nod[k].v;
}
}
void dfs(int a,int nivel,long long val)
{
if(nod[a].f[0])
{
dfs(nod[a].f[0],nivel+1,val*2);
dfs(nod[a].f[1],nivel+1,val*2+1);
return;
}
lg[a]=nivel;
cod[a]=val;
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>nod[i].v;
q[0][i]=i;
}
ve();
dfs(k,0,0);
fout<<sol<<'\n';
for(int i=1;i<=n;i++)
fout<<lg[i]<<' '<<cod[i]<<'\n';
}