Pagini recente » Cod sursa (job #1067794) | Cod sursa (job #2520480) | Cod sursa (job #2681121) | Cod sursa (job #2246627) | Cod sursa (job #2622960)
#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 st[N],dr[N],nivel[N];
int nr,n;
long long ans;
long long val[N],cod[N];
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 mini=q2.front();
q2.pop();
return mini;
}
if(q2.empty())
{
int mini=q1.front();
q1.pop();
return mini;
}
if(val[q1.front()]<val[q2.front()])
{
int mini=q1.front();
q1.pop();
return mini;
}
else
{
int mini=q2.front();
q2.pop();
return mini;
}
}
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;
}