Pagini recente » Cod sursa (job #315238) | Cod sursa (job #3132842) | Cod sursa (job #2934742) | Cod sursa (job #2213912) | Cod sursa (job #1239030)
#include <cstdio>
#include <queue>
#define NMAX 1000005
using namespace std;
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;
}
};
queue <Node*> A, B;
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);
}
void getMin(Node *&a)
{
if (!A.size() || (B.size() && (A.front() -> value) > (B.front() -> value)))
a = B.front(), B.pop();
else
a = A.front(), A.pop();
}
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.push(new Node(x, i));
}
Node *a, *b;
while (A.size() || B.size() >= 2)
{
getMin(a);
getMin(b);
B.push(new Node(b, a));
}
dfs(B.front(), 0, 0);
printf("%lld\n", result);
for (int i = 1; i <= n; i++)
printf("%d %lld\n", L[i], V[i]);
return 0;
}