Pagini recente » Cod sursa (job #3031937) | Cod sursa (job #2387476) | Cod sursa (job #2965057) | Cod sursa (job #1634472) | Cod sursa (job #671049)
Cod sursa(job #671049)
using namespace std;
#include<iostream>
#include<fstream>
#include<queue>
int N;
struct nod{
long long eu,l,r,lg,s;};
nod v[2000010];
long long q[2000010];
int R;
ofstream fout("huffman.out");
int min(int &s1,int &s2)
{
if(q[s1]<q[s2] && s1<=N)
{
s1++;
return s1-1;
}
else
{
s2++;
return s2-1;
}
}
nod unite(int i1,int i2,int k)
{
q[k]=q[i1]+q[i2];
nod a;
//cout<<q[k]<<" "<<k<<" "<<i1<<" "<<i2<<"\n";
a.eu=k;
a.l=i1;
a.r=i2;
return a;
}
void create()
{
int k=N;
int s1=1,s2=k+1;
long long ans=0;
q[s2]=0x3f3f3f3f;
while(s1<=N || s2<k)
{
k++;
v[k]=unite(min(s1,s2),min(s1,s2),k);//vezi ordinea
ans+=q[k];
}
R=k;
fout<<ans<<"\n";
}
void cit()
{
ifstream fin("huffman.in");
fin>>N;
int i;
for(i=1;i<=N;i++)
{
fin>>q[i];
}
fin.close();
}
void dfs(int x,int sum,int lev)
{
if(v[x].l==0)
{
v[x].lg=lev;
v[x].s=sum;
return;
}
else
{
dfs(v[x].l,sum*2+0,lev+1);
dfs(v[x].r,sum*2+1,lev+1);
}
}
int main()
{
cit();
create();
dfs(R,0,0);
for(int i=1;i<=N;i++)
{
fout<<v[i].lg<<" "<<v[i].s<<"\n";
}
fout.close();
return 0;
}