Pagini recente » Cod sursa (job #763987) | Cod sursa (job #541008) | Cod sursa (job #866751) | Cod sursa (job #515097) | Cod sursa (job #792121)
Cod sursa(job #792121)
#include <fstream>
#include <cstdio>
#define MAX 1048576
#define INF ((1LL << 62) - 1)
using namespace std;
struct nod
{
long long v;
int f[2];
}nod[2 * MAX];
long long sol, b[MAX], minim;
int l[2], r[2], q[2][MAX], n, k, p, lgt[MAX], now;
char s[1 << 18];
ifstream in("huffman.in");
void verify()
{
if(!s[now])
{
in.get(s, 1 << 18, '\0');
now = 0;
}
}
int get()
{
int nr = 0;
while(!isdigit(s[now])) now++, verify();
while(isdigit(s[now]))
nr = nr * 10 + s[now] - '0', now++;
return nr;
}
void dfs(int nd, long long cod, int l)
{
if(nod[nd].f[0])
{
dfs(nod[nd].f[0], cod * 2, l + 1);
dfs(nod[nd].f[1], cod * 2 + 1, l + 1);
return;
}
b[nd] = cod;
lgt[nd] = l;
}
void solve()
{
k = n;
l[0] = l[1] = 1;
r[0] = n;
while(l[0] + l[1] <= r[0] + r[1])
{
k++;
for(int i = 0; i < 2; i++)
{
p = 0; minim = INF;
for(int j = 0; j < 2; j++)
{
if(l[j] <= r[j] && nod[q[j][l[j]]].v < minim)
{
minim = nod[q[j][l[j]]].v;
p = j;
}
}
nod[k].f[i] = q[p][l[p]];
nod[k].v += nod[q[p][l[p]++]].v;
}
sol += nod[k].v;
q[1][++r[1]] = k;
}
dfs(k, 0, 0);
}
int main()
{
verify();
n = get();
for(int i = 1; i <= n; i++)
{
nod[i].v = get();
q[0][i] = i;
}
in.close();
solve();
freopen("huffman.out", "w", stdout);
printf("%lld\n", sol);
for(int i = 1; i <= n; i++)
printf("%d %lld\n", lgt[i], b[i]);
fclose(stdout);
return 0;
}