Pagini recente » Cod sursa (job #2897522) | Cod sursa (job #2636312) | Cod sursa (job #790000) | Cod sursa (job #2652480) | Cod sursa (job #1071578)
#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],code;
int n,t,s1,s2,lvl;
void new_node (int x, int y)
{
v[t+n].l = x;
v[t+n].r = y;
}
void dfs (int x)
{
if (x <= n)
{
c[x] = code;
l[x] = lvl;
return;
}
code<<=1;
++lvl;
dfs (v[x].l);
code += 1;
dfs (v[x].r);
--lvl;
code>>=1;
}
int main()
{
fin>>n;
memset (q1,1,sizeof(q1));
memset (q2,1,sizeof(q2));
for (int i=1; i<=n; ++i)
{
fin>>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
{
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);
for (int i=1; i<=n; ++i)
{
fout<<l[i]<<" "<<c[i]<<"\n";
}
}