Pagini recente » Cod sursa (job #611213) | Cod sursa (job #2844191) | Cod sursa (job #1290283) | Cod sursa (job #292417) | Cod sursa (job #550749)
Cod sursa(job #550749)
# include <fstream>
# define inf 1LL*1000000000*1000000000
using namespace std;
ifstream f ("huffman.in");
ofstream g ("huffman.out");
long long int lb[1000005],lg,k,y,x;
int l[1000005],n,vf,i,j,z;
struct nod
{
long long int ap;
int st,dr;
}*p,*v,*q,a[2000005];
class coada
{
int pr,ul;
nod *c[1000005];
public:
coada (){pr=1;ul=0;}
void push (nod *p);
void pop (long long int &y,int &x);
long long int appr ();
}c1,c2;
void coada::push (nod *p)
{
ul++;
c[ul]=p;
}
void coada::pop (long long int &y,int &x)
{
y=c[pr]->ap;
x=pr;
pr++;
}
inline long long int coada::appr ()
{
if (pr<=ul)
return c[pr]->ap;
else
return inf;
}
void df (int k)
{
vf++;
if (a[k].st)
{
x<<=1;
df (a[k].st);
}
if (a[k].dr)
{
x<<=1;
x+=1;
df (a[k].dr);
}
if (a[k].st==0 && a[k].dr==0)
{
l[k]=vf-1;
lb[k]=x;
}
else
lg+=a[k].ap;
vf--;
x>>=1;
}
int main ()
{
f>>n;
for (i=1;i<=n;i++)
{
f>>x;
a[i].ap=x;
a[i].st=0;
a[i].dr=0;
p=&a[i];
c1.push (p);
}
k=n;
for (i=1;i<n;i++)
{
k++;
a[k].ap=0;
for (j=1;j<=2;j++)
if (c1.appr()<c2.appr())
{
c1.pop (y,z);
if (j==1)
a[k].st=z;
else
a[k].dr=z;
a[k].ap+=y;
}
else
{
c2.pop (y,z);
if (j==1)
a[k].st=z+n;
else
a[k].dr=z+n;
a[k].ap+=y;
}
c2.push (&a[k]);
}
v=p;
x=0;
df (k);
g<<lg<<"\n";
for (i=1;i<=n;i++)
g<<l[i]<<" "<<lb[i]<<"\n";
return 0;
}