Pagini recente » Cod sursa (job #444024) | Cod sursa (job #2256983) | Cod sursa (job #2279465) | Cod sursa (job #1353927) | Cod sursa (job #1465217)
#include <stdio.h>
using namespace std;
const int NMAX = 1000100;
const long long INF = (1LL << 62);
struct Nod
{
long long val;
int fii[2]; // fii[0] = fiul stang , fii[1] = fiul drept;
} Arbore[NMAX * 2 + 1];
int n, nr_coada, nod_nou;
int Coada[2][NMAX], s[2], d[2];
int Nivel[NMAX];
long long sol, Min;
long long Val[NMAX];
void citire()
{
scanf("%d", &n);
for(int i=1; i<=n; i++) {
scanf("%d", &Arbore[i].val);
Coada[0][i] = i;
}
}
void dfs(int nod, long long cod, int nivel)
{
if(Arbore[nod].fii[0]) {
dfs(Arbore[nod].fii[0], cod * 2, nivel + 1);
dfs(Arbore[nod].fii[1], cod * 2 + 1, nivel + 1);
return;
}
Nivel[nod] = nivel;
Val[nod] = cod;
}
void rezolva()
{
s[0] = s[1] = 1;
d[0] = nod_nou = n;
while(s[0] + s[1] <= d[0] + d[1])
{
nod_nou++;
for(int i=0; i<2; i++) {
Min = INF;
nr_coada = 0;
for(int j=0; j<2; j++)
{
if(Arbore[Coada[j][s[j]]].val < Min && s[j] <= d[j] ) {
Min = Arbore[Coada[j][s[j]]].val;
nr_coada = j;
}
}
Arbore[nod_nou].val += Arbore[Coada[nr_coada][s[nr_coada]]].val;
Arbore[nod_nou].fii[i] = Coada[nr_coada][s[nr_coada]];
s[nr_coada]++;
}
sol += Arbore[nod_nou].val;
Coada[1][++d[1]] = nod_nou;
}
dfs(nod_nou, 0, 0);
}
void afis()
{
printf("%lld\n", sol);
for(int i=1; i<=n; i++) printf("%d %lld\n", Nivel[i], Val[i]);
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
citire();
rezolva();
afis();
return 0;
}