Pagini recente » Cod sursa (job #1546884) | Cod sursa (job #113719) | Cod sursa (job #1665229) | Cod sursa (job #1220530) | Cod sursa (job #754264)
Cod sursa(job #754264)
#include <cctype>
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int SIZE = 1000002;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
char parse[1 << 18], *now;
inline void verify()
{
if (*now == 0)
{
fin.get(parse, 1 << 18, '\0');
now = parse;
}
}
int get()
{
while (!isdigit(*now))
{
++now;
verify();
}
int number = 0;
while (isdigit(*now))
{
number = number * 10 + (*now - '0');
++now;
verify();
}
return number;
}
int N, F[SIZE];
queue<int> Q[2];
int nodnow;
long long val[2 * SIZE];
int son[2 * SIZE][2];
long long res[SIZE][2], result;
void Dfs(int nod, long long val, int len)
{
if (son[nod][0])
{
Dfs(son[nod][0], val * 2, len + 1);
Dfs(son[nod][1], val * 2 + 1, len + 1);
return;
}
res[nod][0] = len;
res[nod][1] = val;
}
int main()
{
now = parse;
verify();
N = get();
for (int i = 1; i <= N; ++i)
{
F[i] = get();
Q[0].push(i);
val[i] = F[i];
}
nodnow = N;
while (Q[0].size() + Q[1].size() > 1)
{
++nodnow;
for (int i = 0; i < 2; ++i)
{
int now = -1, where;
for (int j = 0; j < 2; ++j)
if (!Q[j].empty() && (now == -1 || val[now] > val[Q[j].front()]))
{
now = Q[j].front();
where = j;
}
Q[where].pop();
val[nodnow] += val[now];
son[nodnow][i] = now;
}
Q[1].push(nodnow);
}
Dfs(nodnow, 0, 0);
for (int i = 1; i <= N; ++i)
result += F[i] * res[i][0];
fout << result << '\n';
for (int i = 1; i <= N; ++i)
fout << res[i][0] << ' ' << res[i][1] << '\n';
fin.close();
fout.close();
}