Pagini recente » Cod sursa (job #2688809) | Cod sursa (job #1328163) | Cod sursa (job #1212870) | Cod sursa (job #1582199) | Cod sursa (job #1212135)
#include <fstream>
#include <vector>
#define DIM 1000010
#define INF (1LL<<62)
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
pair<long long, pair< int, int > > L[2*DIM];
long long cost;
long long C[DIM], V[DIM], W[DIM];
int H[DIM], S[DIM];
int n, m, k, i, j;
long long a, b, c, d;
void df(int nod, int niv, long long cod) {
S[niv] = cod;
if (nod > n)
cost += L[nod].first;
if (nod <= n) {
/*
C[nod] = 0;
for (int i=0;i<=niv;i++)
if (S[i] != -1)
C[nod] = C[nod]*2 + S[i];
*/
C[nod] = cod;
H[nod] = niv;
}
if (L[nod].first > 0) {
df(L[nod].second.first, niv+1, cod*2);
df(L[nod].second.second, niv+1, cod*2+1);
}
}
int main() {
fin>>n;
for (i=1;i<=n;i++)
fin>>V[i];
i = 1;
j = 1;
m = 0;
k = n;
while (k<2*n-1) {
if (i<=n)
a = V[i];
else
a = INF;
if (i+1<=n)
b = V[i+1];
else
b = INF;
if (j<=m)
c = W[j];
else
c = INF;
if (j+1<=m)
d = W[j+1];
else
d = INF;
// doua din V
if (b <= c) {
k++;
L[k] = make_pair(a+b, make_pair(i, i+1) );
i+=2;
m++;
W[m] = a+b;
continue;
}
//doua din w
if (d <= a) {
k++;
L[k] = make_pair(c+d, make_pair(n+j, n+j+1) );
j+=2;
m++;
W[m] = c+d;
continue;
}
k++;
L[k] = make_pair(a+c, make_pair(i, n+j) );
i++;
j++;
m++;
W[m] = a+c;
//cate una din fiecare
}
df(2*n-1, 0, 0);
fout<<cost<<"\n";
for (i=1;i<=n;i++)
fout<<H[i]<<" "<<C[i]<<"\n";
return 0;
}