Pagini recente » Profil Samuilescu_Raluca_Gabriela_323CA | Cod sursa (job #1962967) | Istoria paginii runda/hmmmmm | Cod sursa (job #705869) | Cod sursa (job #976773)
Cod sursa(job #976773)
#include <fstream>
#include <queue>
#include <iostream>
using namespace std;
ifstream fin ("huffman.in");
ofstream fout ("huffman.out");
const int N = (int)(1e6+5);
long long v[N*2], sol, cod[N], l[N];
pair <int, int> fiu[N*2];
queue <int> Q1, Q2;
int last, n;
void dfs(int x, long long lv, long long code) {
if (x > n) {
sol += v[x];
dfs(fiu[x].first, lv + 1, code * 2);
dfs(fiu[x].second, lv + 1, code * 2 + 1);
}
else {
l[x] = lv;
cod[x] = code;
}
}
int get_min() {
int MIN;
if (!Q2.size()) {
MIN = Q1.front(); Q1.pop();
return MIN;
}
if (!Q1.size()) {
MIN = Q2.front(); Q2.pop();
return MIN;
}
if (v[Q1.front()] <= v[Q2.front()]) {
MIN = Q1.front(); Q1.pop();
return MIN;
}
MIN = Q2.front(); Q2.pop();
return MIN;
}
int main() {
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> v[i];
Q1.push(i);
}
last = n;
while (Q1.size() + Q2.size() > 1) {
int MIN1 = get_min();
int MIN2 = get_min();
v[++last] = v[MIN1] + v[MIN2];
fiu[last].first = MIN1;
fiu[last].second = MIN2;
Q2.push(last);
}
dfs(last, 0, 0);
//for (int i = 1; i <= last; ++i)
//cout << i << " " << v[i] << " " << fiu[i].first << " " << fiu[i].second << "\n";
fout << sol << "\n";
for (int i = 1; i <= n; ++i)
fout << l[i] << " " << cod[i] << "\n";
}