Pagini recente » Cod sursa (job #1311112) | Cod sursa (job #2586288) | Cod sursa (job #2775303) | Cod sursa (job #1488323) | Cod sursa (job #1434375)
#include<iostream>
#include<fstream>
#include<deque>
using namespace std;
#define nmax 1000000
int d[2][nmax],st[2],f[2];
long long rez=0;
long long c[nmax],nv[nmax];
struct nod
{
long long v;
long l,r;
};
nod h[nmax*2];
int n;
ifstream in("huffman.in");
ofstream out("huffman.out");
void bf(int poz,long long put,int nivel)
{
if(h[poz].l)
{
bf(h[poz].l,put*2,nivel+1);
bf(h[poz].r,put*2+1,nivel+1);
}
c[poz]=put;
nv[poz]=nivel;
}
void rezolva()
{
int k=n;
st[0]=1;st[1]=1;
f[0]=n;f[1]=0;
int c[2];
int j;
while(f[0]-st[0]>=0 || f[1]-st[1]>0)
{
int p=0;
++k;
for(j=0;j<2;j++)
{
if(!(f[0]-st[0]>=0))
p=1;
else if(!(f[1]-st[1]>=0))
p=0;
else
p=(d[0][st[0]]<d[1][st[1]]) ? 0 : 1;
c[j]=st[p]+ n*p;
st[p]++;
}
h[k].l=c[0];
h[k].r=c[1];
h[k].v=h[c[0]].v + h[c[1]].v;
rez+=h[k].v;
d[1][++f[1]]=h[k].v;
}
bf(k,0,0);
}
int main()
{
in>>n;
for(int i=1;i<=n;i++)
{
in>>h[i].v;
d[0][i]=h[i].v;
}
rezolva();
out<<rez<<'\n';
for(int i=1;i<=n;i++)
out<<nv[i]<<" "<<c[i]<<'\n';
return 0;
}