Pagini recente » Cod sursa (job #1512828) | Cod sursa (job #553918) | Cod sursa (job #2917854) | Cod sursa (job #2745431) | Cod sursa (job #1212154)
#include <cstdio>
#include <vector>
#include <cstring>
#define DIM 1000010
#define INF (1LL<<62)
using namespace std;
FILE *fin = fopen("huffman.in","r");
FILE *fout = fopen("huffman.out","w");
pair<long long, pair< int, int > > L[2*DIM];
long long cost;
long long C[DIM], V[DIM], W[DIM];
int H[DIM];
int n, m, k, i, j, niv;
long long a, b, c, d;
void df(int nod, long long cod) {
niv++;
if (nod > n)
cost += L[nod].first;
if (nod <= n) {
C[nod] = cod;
H[nod] = niv;
}
if (L[nod].first > 0) {
df(L[nod].second.first, cod<<1);
df(L[nod].second.second, (cod<<1)+1);
}
niv--;
}
int main() {
memset(V, 1, sizeof(V));
memset(W, 1, sizeof(W));
fscanf(fin, "%d", &n);
for (i=1;i<=n;i++)
fscanf(fin, "%lld", &V[i]);
i = 1;
j = 1;
m = 0;
k = n;
int t = 2*n-1;
while (k<t) {
// doua din V
if (V[i+1] <= W[j]) {
k++;
L[k] = make_pair(V[i]+V[i+1], make_pair(i, i+1) );
m++;
W[m] = V[i]+V[i+1];
i+=2;
continue;
}
//doua din w
if (W[j+1] <= V[i]) {
k++;
L[k] = make_pair(W[j]+W[j+1], make_pair(n+j, n+j+1) );
m++;
W[m] = W[j]+W[j+1];
j+=2;
continue;
}
k++;
L[k] = make_pair(V[i]+W[j], make_pair(i, n+j) );
m++;
W[m] = V[i]+W[j];
i++;
j++;
//cate una din fiecare //cate una din fiecare
}
niv = -1;
df(2*n-1, 0);
fprintf(fout,"%lld\n", cost);
for (i=1;i<=n;i++)
fprintf(fout,"%d %lld\n", H[i], C[i]);
return 0;
}