Pagini recente » Cod sursa (job #90867) | Cod sursa (job #2463178) | Cod sursa (job #1345183) | Profil StarGold2 | Cod sursa (job #1524201)
#include <bits/stdc++.h>
using namespace std;
long long a[2000005];
int ls[2000005];
int rs[2000005];
int n, v;
pair<int, long long> b[1000005];
void dfs(int poz, long long p, int niv) {
if(!ls[poz]) {
b[poz].first = niv;
b[poz].second = p;
return ;
}
dfs(ls[poz], p * 2, niv + 1);
dfs(rs[poz], p * 2 + 1, niv + 1);
}
pair<long long, int> q[1000005];
int h;
void sus(int poz) {
pair<long long, int> key = q[poz];
while(poz > 1 && key.first > q[poz / 2].first) {
q[poz] = q[poz / 2];
poz /= 2;
}
q[poz] = key;
}
void jos(int poz) {
int son;
do {
son = 0;
if((poz << 1) <= h) {
son = poz << 1;
if((son + 1) <= h && q[son + 1].first > q[son].first)
son ++;
if(q[son].first <= q[poz].first)
son = 0;
}
if(son) {
pair<long long, int> aux = q[poz];
q[poz] = q[son];
q[son] = aux;
poz = son;
}
}
while(son);
}
void ins(pair<long long, int> aux) {
q[h] = aux;
sus(h);
}
void top() {
pair<long long, int> aux = q[1];
q[1] = q[h];
q[h] = aux;
h --;
jos(1);
}
int main()
{
FILE *f = fopen("huffman.in", "r");
FILE *g = fopen("huffman.out", "w");
fscanf(f, "%d", &n);
for(int i = 1; i <= n; i ++) {
fscanf(f, "%lld", &a[i]);
h = i;
ins(make_pair(-a[i], i));
}
int m = n;
while(h > 1) {
top(); int fst = q[h + 1].second;
top(); int snd = q[h + 1].second;
h ++;
m ++;
a[m] = a[fst] + a[snd];
ls[m] = fst; rs[m] = snd;
ins(make_pair(-a[m], m));
}
int start = m;
dfs(start, 0, 0);
long long s = 0;
for(int i = 1; i <= n; i ++) {
s += b[i].first * a[i];
}
fprintf(g, "%lld\n", s);
for(int i = 1; i <= n; i ++) {
fprintf(g, "%d %lld\n", b[i].first, b[i].second);
}
return 0;
}