Pagini recente » Cod sursa (job #1564444) | Cod sursa (job #3135994) | Cod sursa (job #994320) | Cod sursa (job #2475218) | Cod sursa (job #2622956)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
const int N=2e6+1;
queue<int>q1,q2;
int val[N],st[N],dr[N],cod[N],nivel[N];
int nr,n,ans;
void adauga(int x,int y)
{
val[++nr]=val[x]+val[y];
st[nr]=x;
dr[nr]=y;
q2.push(nr);
}
int minim()
{
if(q1.empty())
{
int minim=q2.front();
q2.pop();
return minim;
}
if(q2.empty())
{
int minim=q1.front();
q1.pop();
return minim;
}
if(val[q1.front()]<val[q2.front()])
{
int minim=q1.front();
q1.pop();
return minim;
}
else
{
int minim=q2.front();
q2.pop();
return minim;
}
}
long long rez(int x)
{
long long sum=0;
if(st[x]!=0)
{
cod[st[x]]=cod[x]*2;
nivel[st[x]]=nivel[x]+1;
cod[dr[x]]=cod[x]*2+1;
nivel[dr[x]]=nivel[x]+1;
sum+=val[x]+rez(st[x])+rez(dr[x]);
}
return sum;
}
int main()
{
fin>>n;
nr=n;
for(int i=1;i<=n;i++)
{
fin>>val[i];
q1.push(i);
}
while(q1.size()+q2.size()>1)
{
int x=minim();
int y=minim();
adauga(x,y);
}
for(int i=n+1;i<=nr;i++)
{
ans+=val[i];
}
fout<<ans<<'\n';
rez(nr);
for(int i=1;i<=n;i++)
{
fout<<nivel[i]<<" "<<cod[i]<<'\n';
}
return 0;
}