Pagini recente » Cod sursa (job #385299) | Cod sursa (job #488334) | Cod sursa (job #427354) | Cod sursa (job #1236400) | Cod sursa (job #928780)
Cod sursa(job #928780)
#include<stdio.h>
#include<queue>
#define maxn 1000005
using namespace std;
struct nod{long long int f;int st,dr;} v[maxn*2];
int n,m;
long long int l[maxn],cod[maxn],s;
queue <int> q1,q2;
void cit()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%lld",&v[i].f);
q1.push(i);
}
m=n;
}
int extract_min()
{
int minn;
if(q2.empty()) { minn=q1.front(); q1.pop(); return minn;}
if(q1.empty()) { minn=q2.front(); q2.pop(); return minn;}
if(v[q1.front()].f<=v[q2.front()].f) { minn=q1.front(); q1.pop(); return minn;}
minn=q2.front(); q2.pop(); return minn;
}
void create_tree()
{
int min1,min2;
while(q1.size()+q2.size()>1)
{
min1=extract_min();
min2=extract_min();
m++;
v[m].f=v[min1].f+v[min2].f;
v[m].st=min1; v[m].dr=min2;
q2.push(m);
}
}
void df(int k,long long int cd,long long int niv)
{
if(v[k].st)
{
df(v[k].st,cd*2,niv+1);
df(v[k].dr,cd*2+1,niv+1);
}
else
{
l[k]=niv;
cod[k]=cd;
s+=(niv*v[k].f);
}
}
void afis()
{
int i;
printf("%lld\n",s);
for(i=1;i<=n;i++) printf("%lld %lld\n",l[i],cod[i]);
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
cit();
create_tree();
df(m,0,0);
afis();
fclose(stdin);
fclose(stdout);
return 0;
}