Pagini recente » Cod sursa (job #285176) | Cod sursa (job #1356003) | Cod sursa (job #1870332) | Cod sursa (job #2370401) | Cod sursa (job #2617413)
#include <fstream>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
const int N=1e6;
int n, st[2*N], dr[2*N], p, u, v[N], nr, lg[2*N], q[2*N];
long long codul[2*N], val[2*N];
void reuniune(int x, int y)
{
++nr;
val[nr]=val[x]+val[y];
st[nr] = x;
dr[nr] = y;
q[++u]=nr;
}
void preordine(int x)
{
if( st[x] != 0)
{
codul[st[x]]=codul[x]*2;
lg[st[x]]=1+lg[x];
preordine(st[x]);
}
if(dr[x]!=0)
{
codul[dr[x]]=codul[x]*2+1;
lg[dr[x]]=1+lg[x];
preordine(dr[x]);
}
}
int lungime(long long x)
{
int l=0;
do
{
l++;
x/=2;
}
while(x!=0);
return l;
}
int main()
{
in>>n;
for(int i=1; i<=n; i++)
in>>val[i];
u=-1;
int i=3;
nr=n;
reuniune(1, 2);
while(i<=n or p<u)
{
if(i<=n and val[i]<=val[q[p]])
{
if(i < n and val[i+1]<=val[q[p]])
reuniune(i, i+1), i+=2;
else
reuniune(i++, q[p++]);
}
else if(i<=n and (p==u or val[i]<=val[q[p+1]]))
reuniune(q[p++], i++);
else
reuniune(q[p], q[p+1]), p+=2;
}
codul[nr]=0;
preordine(nr);
long long int sum=0;
for(int i=n+1; i<=nr; i++)
sum += val[i];
out<<sum<<"\n";
for(int i=1; i<=n; i++)
out<<lg[i]<<" "<<codul[i]<<"\n";
return 0;
}