Pagini recente » Cod sursa (job #130136) | Cod sursa (job #1385968) | Cod sursa (job #1915052) | Cod sursa (job #2437569) | Cod sursa (job #2731656)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1000001;
int N;
int q1[NMAX], q2[NMAX];
int son[2][2 * NMAX];
int h[2 * NMAX];
long long v[2 * NMAX];
void dfs(int node, int father = 0)
{
h[node] = h[father] + 1;
if (son[0][node] != 0 && son[1][node] != 0)
{
v[son[0][node]] = 2LL * v[node];
v[son[1][node]] = 2LL * v[node] + 1;
dfs(son[0][node], node);
dfs(son[1][node], node);
}
}
int main()
{
ifstream fin("huffman.in");
ofstream fout("huffman.out");
fin >> N;
for (int i = 1;i <= N;++i)
{
fin >> v[i];
q1[i] = i;
}
int pos = 1, left = 1, right = 0;
int step = N, a, b;
long long answer = 0;
for (int i = 1;i < N;++i)
{
if (left > right || (pos <= N && v[q1[pos]] < v[q2[left]]))
a = q1[pos++];
else
a = q2[left++];
if (left > right || (pos <= N && v[q1[pos]] < v[q2[left]]))
b = q1[pos++];
else
b = q2[left++];
++step;
son[0][step] = a;
son[1][step] = b;
v[step] = v[a] + v[b];
q2[++right] = step;
answer += v[a] + v[b];
}
h[0] = -1;
v[step] = 0;
dfs(step);
fout << answer << "\n";
for (int i = 1;i <= N;++i)
fout << h[i] << " " << v[i] << "\n";
fin.close();
fout.close();
return 0;
}