Pagini recente » Cod sursa (job #1559049) | Cod sursa (job #2199707) | Cod sursa (job #2818137) | Cod sursa (job #2238988) | Cod sursa (job #2687286)
#include <bits/stdc++.h>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
long long v[2000005];
queue<int> init, intern;
int n, nr;
long long s;
int mu[2000005][2];
long long rez[1000005];
int lung[1000005];
long long getmin() {
int ret = 0;
if (!init.empty() && (intern.empty() || v[init.front()] <= v[intern.front()])) {
ret = init.front();
init.pop();
return ret;
}
ret = intern.front();
intern.pop();
return ret;
}
void dfs(int ind_nod, long long cod, int l) {
if (ind_nod <= n) {
rez[ind_nod] = cod;
lung[ind_nod] = l;
return;
}
dfs(mu[ind_nod][0], cod << 1, l + 1);
dfs(mu[ind_nod][1], (cod << 1) | 1, l + 1);
}
int main()
{
in >> n;
for (int i = 1; i <= n; i++) {
in >> v[i];
init.push(i);
}
nr = n;
while ((int)init.size() + (int)intern.size() > 1) {
long long a, b;
a = getmin();
b = getmin();
int c;
nr++;
c = nr;
v[c] = v[a] + v[b];
intern.push(c);
mu[nr][0] = a;
mu[nr][1] = b;
s += v[c];
}
dfs(nr, 0, 0);
out << s << "\n";
for (int i = 1; i <= n; i++)
out << lung[i] << " " << rez[i] << "\n";
return 0;
}