Pagini recente » Cod sursa (job #2258932) | Cod sursa (job #560631) | Cod sursa (job #2801462) | Cod sursa (job #921170) | Cod sursa (job #1239029)
#include <cstdio>
#define NMAX 1000005
int n;
struct Node
{
Node* left, *right;
long long value;
int idx;
Node(int val, int givenIdx)
{
value = val;
idx = givenIdx;
left = right = NULL;
}
Node(Node* x, Node* y)
{
value = (x -> value) + (y -> value);
left = x; right = y;
}
};
Node* A[NMAX], *B[NMAX];
int m, L[NMAX];
long long result = 0, V[NMAX];
void dfs(Node* node, long long val, int len)
{
if (node -> left == NULL && node -> right == NULL)
{
L[node -> idx] = len;
V[node -> idx] = val;
return ;
}
result += node -> value;
if (node -> left) dfs(node -> left, val << 1, len + 1);
if (node -> right) dfs(node -> right, (val << 1) + 1, len + 1);
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
scanf("%d", &n);
int x;
for (int i = 1; i <= n; i++)
{
scanf("%d", &x);
A[i] = new Node(x, i);
}
int posA = 1, posB = 1;
Node *a, *b;
while (posA <= n || posB < m)
{
if (posA > n || (posB <= m && A[posA] -> value > B[posB] -> value))
a = B[posB++];
else
a = A[posA++];
if (posA > n || (posB <= m && A[posA] -> value > B[posB] -> value))
b= B[posB++];
else
b = A[posA++];
B[++m] = new Node(b, a);
}
dfs(B[m], 0, 0);
printf("%lld\n", result);
for (int i = 1; i <= n; i++)
printf("%d %lld\n", L[i], V[i]);
return 0;
}