Pagini recente » Cod sursa (job #1677829) | Cod sursa (job #1087750) | Cod sursa (job #463113) | Cod sursa (job #2319073) | Cod sursa (job #1071579)
#include <fstream>
#include <cstring>
#define maxn 1000005
#define inf 1000000001
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
struct tree
{
int l,r;
}v[2*maxn];
long long q1[maxn],q2[maxn],lg;
long long c[maxn];
int l[maxn];
int n,t,s1,s2;
void new_node (int x, int y)
{
v[t+n].l = x;
v[t+n].r = y;
}
void dfs (int x, long long code, int lvl)
{
if (x <= n)
{
c[x] = code;
l[x] = lvl;
return;
}
dfs (v[x].l,code<<1,lvl+1);
dfs (v[x].r,(code<<1)+1,lvl+1);
}
int main()
{
freopen ("huffman.in","r",stdin);
scanf ("%d",&n);
memset (q1,1,sizeof(q1));
memset (q2,1,sizeof(q2));
for (int i=1; i<=n; ++i)
{
scanf ("%lld",&q1[i]);
}
s1 = 1;
s2 = 1;
t = 0;
while (s1 <= n || s2 < t)
{
if (q1[s1] <= q2[s2+1] && q2[s2] <= q1[s1+1])
{
q2[++t] = q1[s1] + q2[s2];
new_node (s1,s2+n);
++s1;
++s2;
}
else if (q1[s1+1] <= q2[s2])
{
q2[++t] = q1[s1] + q1[s1+1];
new_node (s1,s1+1);
s1 += 2;
}
else if (q2[s2+1] <= q1[s1])
{
q2[++t] = q2[s2] + q2[s2+1];
new_node (s2+n,s2+n+1);
s2 += 2;
}
lg += q2[t];
}
fout<<lg<<"\n";
dfs (t+n,0,0);
for (int i=1; i<=n; ++i)
{
fout<<l[i]<<" "<<c[i]<<"\n";
}
}