Pagini recente » Cod sursa (job #303133) | Cod sursa (job #1476395) | Cod sursa (job #3194011) | Cod sursa (job #17229) | Cod sursa (job #470993)
Cod sursa(job #470993)
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int NMAX = 1000005;
const int INF = 1<<30;
struct nod
{
int val;
int fiu[2];
nod()
{
val = 0;
fiu[1] = 0;
fiu[2] = 0;
}
}Heap[2 * NMAX + 1];
int N;
int fol[2 * NMAX + 1];
int REZ;
int lg_sir[NMAX];
long long baza_10[NMAX];
int q[2][2 * NMAX + 1];
void citi()
{
cin >> N;
for(int i = 1 ; i <= N ; i++)
{
cin >> Heap[i].val;
q[0][i] = i;
}
}
void construi()
{
int cr = N;
int inc[2] , sf[2];
inc[0] = 1 ; inc[1] = 1;
sf[0] = N ; sf[1] = 0;
while(inc[0] + inc[1] <= sf[0] + sf[1])
{
++cr;
for(int i = 0 ; i < 2 ; i++)
{
int minim = INF, poz;
for(int j = 0 ; j < 2 ; j++)
if(Heap[q[j][inc[j]]].val < minim && inc[j] <= sf[j])
{
minim = Heap[q[j][inc[j]]].val;
poz = j;
}
Heap[cr].fiu[i] = q[poz][inc[poz]];
Heap[cr].val += minim;
inc[poz]++;
}
q[1][++sf[1]] = cr;
REZ += Heap[cr].val;
}
}
void dfs(int nod, long long sir, int nivel)
{
if(Heap[nod].fiu[0])
{
dfs(Heap[nod].fiu[0], 2 * sir, nivel + 1);
dfs(Heap[nod].fiu[1], 2 * sir + 1, nivel + 1);
return;
}
lg_sir[nod] = nivel;
baza_10[nod] = sir;
}
void scrie()
{
printf("%d\n", REZ);
for(int i = 1 ; i <= N ; i++)
printf("%d %lld\n", lg_sir[i], baza_10[i]);
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
citi();
construi();
dfs(2 * N - 1, 0, 0);
scrie();
return 0;
}