Pagini recente » Cod sursa (job #773928) | Cod sursa (job #1962037) | Cod sursa (job #2743068) | Cod sursa (job #2360746) | Cod sursa (job #2495437)
#include <bits/stdc++.h>
#define DIM 1000005
using namespace std;
ifstream fin ("huffman.in");
ofstream fout ("huffman.out");
long long n, i, j, k, m, t, niv, cost;
long long h[DIM], c[DIM], v[DIM], w[DIM];
pair <long long, pair<int, int> > L[2*DIM];
void dfs (int nod, long long codificare){
niv++;
if (nod > n){
cost += L[nod].first;
}
else{
c[nod] = codificare;
h[nod] = niv;
}
if (L[nod].first){
dfs (L[nod].second.first, codificare<<1);
dfs (L[nod].second.second, (codificare<<1) + 1);
}
niv--;
}
int main(){
fin >> n;
memset(v, 1, sizeof(v));
memset(w, 1, sizeof(w));
for (i=1; i<=n; i++){
fin >> v[i];
}
i = 1, j = 1, k = n, t = 2*n-1;
while (k < t){
if (v[i+1] <= w[j]){
L[++k] = make_pair (v[i] + v[i+1], make_pair(i, i+1));
w[++m] = v[i] + v[i+1];
i+=2;
}
else if (w[j+1] <= v[i]){
L[++k] = make_pair (w[j] + w[j+1], make_pair(n+j, n+j+1));
w[++m] = w[j] + w[j+1];
j+=2;
}
else{
L[++k] = make_pair (v[i] + w[j], make_pair(i, n+j));
w[++m] = v[i] + w[j];
i++, j++;
}
}
niv = -1;
dfs(2*n-1, 0);
fout << cost << "\n";
for (i=1; i<=n; i++){
fout << h[i] << " " << c[i] << "\n";
}
return 0;
}