Pagini recente » Istoria paginii runda/simulare_de_oni_9/clasament | Istoria paginii runda/allyoucancode2008 | Cod sursa (job #2807463) | Cod sursa (job #194810) | Cod sursa (job #1071575)
#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],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*2,lvl+1);
dfs (v[x].r,code*2+1,lvl+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 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";
}
}