Pagini recente » Cod sursa (job #3258477) | Cod sursa (job #2648768) | Cod sursa (job #3004974) | Cod sursa (job #2124702) | Cod sursa (job #848991)
Cod sursa(job #848991)
#include<fstream>
#define LL long long
using namespace std;
const int Nmax = 1000005, MaxS=10000050;
struct cuplu {LL cost; int poz;};
LL lg, bz[Nmax], val[2*Nmax];
int n, nr, fs[2*Nmax], fd[2*Nmax], nrbiti[Nmax];
cuplu q1[Nmax], q2[Nmax];
int pq1=1, uq1, pq2=1, uq2;
char S[MaxS];
inline void cr(const cuplu &a, const cuplu &b)
{ val[++nr]=q2[++uq2].cost=a.cost + b.cost; q2[uq2].poz=nr;
fd[nr] = a.poz; fs[nr] = b.poz;
}
inline void df(int nod, int niv, LL b10)
{ if(nod!=nr)lg += val[nod];
if(nod<=n)
{ nrbiti[nod] = niv; bz[nod] = b10; return;}
df(fd[nod], niv+1, (b10<<1)+1);
df(fs[nod], niv+1, (b10<<1));
}
void cit()
{ ifstream f("huffman.in");
f>>n;
f.getline(S,MaxS,EOF);
for(int i=0;S[i];i++)
if(isdigit(S[i]))
{ for(++nr;isdigit(S[i]);val[nr] = val[nr]*10+S[i++]-'0');
q1[++uq1].poz=nr; q1[uq1].cost=val[nr];
}
}
void afis()
{ freopen("huffman.out","w",stdout);
printf("%lld\n",lg);
for(int i=1; i<=n; i++) printf("%d %lld\n",nrbiti[i],bz[i]);
}
int main()
{ cit();
nr = n;
cr(q1[pq1++],q1[pq1++]);
while(pq1<=uq1)
{ if(q1[pq1].cost > q2[pq2].cost)
{ if(pq2>=uq2) cr(q2[pq2++],q1[pq1++]);
else if(q1[pq1].cost > q2[pq2+1].cost) cr(q2[pq2++],q2[pq2++]);
else cr(q2[pq2++],q1[pq1++]);
}
else { if(pq1>=uq1)cr(q1[pq1++],q2[pq2++]);
else if(q1[pq1+1].cost > q2[pq2].cost) cr(q1[pq1++],q2[pq2++]);
else cr(q1[pq1++],q1[pq1++]);
};
};
while(pq2<uq2) cr(q2[pq2++],q2[pq2++]);
df(nr,0,0);
afis();
return 0;
}