Pagini recente » Cod sursa (job #1115265) | Cod sursa (job #385634) | Cod sursa (job #2255730) | Cod sursa (job #1388224) | Cod sursa (job #2978487)
#include <bits/stdc++.h>
using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");
const int CMAX = 2e6 + 15;;
int n;
long long temp;
struct noduri {
int st, dr, niv;
long long val;
}heap[CMAX];
void read() {
f >> n;
for (int i = 1; i <= n; i++)
f >> heap[i].val;
}
void parcurgere_srd(int nod, int niv, long long val) {
if (nod > 0) {
heap[nod].val = val;
heap[nod].niv = niv;
parcurgere_srd(heap[nod].st, niv + 1, val * 2);
parcurgere_srd(heap[nod].dr, niv + 1, (val * 2) + 1);
}
}
void huffman() {
heap[n + 1].val = LONG_LONG_MAX;
int i, j, stop, st, dr;
i = 1;
j = n + 2;
stop = n + 1;
while (i < n + 1 || j < stop) {
if (j <= stop && heap[j].val < heap[i].val)
st = j++;
else {
st = i++;
}
if (j <= stop && heap[j].val < heap[i].val) {
dr = j++;
}
else
{
dr = i++;
}
heap[++stop].val = heap[st].val + heap[dr].val;
heap[stop].st = st;
heap[stop].dr = dr;
temp = temp + heap[stop].val;
}
parcurgere_srd(stop, 0, 0);
}
int main()
{
read();
huffman();
g << temp << '\n';
for (int i = 1; i <= n; i++)
g << heap[i].niv << " " << heap[i].val << '\n';
return 0;
}