Pagini recente » Cod sursa (job #2230808) | Cod sursa (job #2819682) | Cod sursa (job #1737886) | Cod sursa (job #1498087) | Cod sursa (job #1661232)
#include <stdio.h>
#define INF 1LL * 1000000000 * 1000000000
#define nMax 1000009
using namespace std;
struct noduri
{
long long cpt;
int f[2];
}node[2*nMax];
int q[2][nMax], l[2], r[2], k, n, lg[nMax];
long long code[nMax], Sol;
void read()
{
scanf("%d", &n);
for(int i=1;i<=n;i++)
{
scanf("%d%", &node[i].cpt);
q[0][i]=i;
}
}
void dfs(int poz, long long cod, int lev)
{
if(node[poz].f[0])
{
dfs(node[poz].f[0], cod*2, lev+1);
dfs(node[poz].f[1], cod*2+1, lev+1);
return;
}
lg[poz]=lev;
code[poz]=cod;
}
void solve()
{
k=n;
l[0]=l[1]=1;
r[0]=n;
while(l[0]+l[1]<=r[0]+r[1])
{
k++;
for(int j=0;j<2;j++)
{
int poz=0;
long long Min=INF;
for(int i=0;i<2;i++)
{
if(node[q[i][l[i]]].cpt<Min && l[i]<=r[i])
{
poz=i;
Min=node[q[i][l[i]]].cpt;
}
}
node[k].f[j]=q[poz][l[poz]];
node[k].cpt+=Min;
l[poz]++;
}
Sol+=node[k].cpt;
q[1][++r[1]]=k;
}
dfs(k, 0, 0);
}
void write()
{
printf("%lld\n", Sol);
for(int i=1;i<=n;i++)
printf("%d %lld\n", lg[i], code[i]);
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
read();
solve();
write();
return 0;
}