Pagini recente » Cod sursa (job #1908831) | Cod sursa (job #381492) | Cod sursa (job #2225274) | Cod sursa (job #1776208) | Cod sursa (job #1524146)
#include <bits/stdc++.h>
using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");
long long a[2000005];
int ls[2000005];
int rs[2000005];
int n, v;
priority_queue< pair<long long, int> > q;
pair<int, long long> b[1000005];
void dfs(int poz, long long p, int niv) {
if(poz <= n) {
b[poz].first = niv;
b[poz].second = p;
return ;
}
dfs(ls[poz], p * 2, niv + 1);
dfs(rs[poz], p * 2 + 1, niv + 1);
}
int main()
{
f >> n;
for(int i = 1; i <= n; i ++) {
f >> a[i];
q.push(make_pair(-a[i], i));
}
int m = n + 1;
while(q.size() > 1) {
int fst = q.top().second; q.pop();
int snd = q.top().second; q.pop();
a[m] = a[fst] + a[snd];
ls[m] = fst; rs[m] = snd;
q.push(make_pair(-a[m], m));
m ++;
}
int start = m - 1;
dfs(start, 0, 0);
long long s = 0;
for(int i = 1; i <= n; i ++) {
s += b[i].first * a[i];
}
g << s << "\n";
for(int i = 1; i <= n; i ++) {
g << b[i].first << " " << b[i].second << "\n";
}
return 0;
}