Pagini recente » Cod sursa (job #1944476) | Cod sursa (job #2314298) | Cod sursa (job #2140529) | Cod sursa (job #2661215) | Cod sursa (job #2517941)
#include <bits/stdc++.h>
#define PII pair<int,int>
#define PLI pair<long long,int>
#define LL long long
#define Val first
#define Poz second
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
int n;
LL val[2000001];
PII decInit[1000001];
PLI decComp[1000001];
int vf,st1=1,dr1,st2=1,dr2;
PII fii[1000001];
int tata[2000001];
unsigned LL sum;
LL cod[1000001];
int lung[1000001];
int pasi[1000001];
PLI atrib()
{
if(st2>dr2)
return decInit[st1++];
else if(st1>dr1)
return decComp[st2++];
else if(decInit[st1].Val<decComp[st2].Val)
return decInit[st1++];
else
return decComp[st2++];
}
int main()
{
in>>n;
vf=n;
for(int i=1;i<=n;i++)
{
in>>val[i];
decInit[++dr1]={val[i],i};
}
PLI nod1,nod2;
while(st1<=dr1 || st2<=dr2)
{
nod1=atrib();
nod2=atrib();
val[++vf]=nod1.Val+nod2.Val;
fii[vf]={nod1.Poz,nod2.Poz};
tata[nod1.Poz]=vf;
tata[nod2.Poz]=vf;
if(st1<=dr1 || st2<=dr2)
decComp[++dr2]={val[vf],vf};
}
for(int i=1;i<=n;i++)
{
int poz=i;
pasi[0]=i;
while(tata[poz])
{
pasi[++lung[i]]=tata[poz];
poz=tata[poz];
}
for(int j=lung[i];j;j--)
if(fii[ pasi[j] ].first==pasi[j-1])
cod[i]=cod[i]*2;
else
cod[i]=cod[i]*2+1;
sum+=val[i]*lung[i];
}
out<<sum<<'\n';
for(int i=1;i<=n;i++)
out<<lung[i]<<' '<<cod[i]<<'\n';
return 0;
}