Pagini recente » Cod sursa (job #2934493) | Cod sursa (job #3240885) | Cod sursa (job #1285431) | Cod sursa (job #1916885) | Cod sursa (job #770854)
Cod sursa(job #770854)
#include <fstream>
#define Inf 8000000000000000000LL
using namespace std;
short lung[1000010];
long long val[1000010],lg=0;
long long k[2000020],t1,t2;
int h[2000020],n;
inline void huff (int c,int u,long long v)
{
if (c<n) {
lung[c]=u;
val[c]=v;
lg+=u*k[c];
return;
}
c-=n;
huff (h[c<<1],u+1,v<<1);
huff (h[(c<<1)+1],u+1,(v<<1)+1);
}
ifstream in("huffman.in");
ofstream out("huffman.out");
int main () {
int i=0,c1=0,c2,d2,c=2;
in >> n;
c2=d2=n+1;
long long t1,t2;
for (; i<n; i++)
in >> k[i];
for (; i<=n<<1; i++) k[i]=Inf;
while (1) {
if (k[c1]<=k[c2]) {
h[c++]=c1;
t1=k[c1++];
}
else {
h[c++]=c2;
t1=k[c2++];
}
if (k[c1]<=k[c2]) {
h[c++]=c1;
t2=k[c1++];
}
else {
h[c++]=c2;
t2=k[c2++];
}
if (t2==Inf) break;
k[d2++]=t1+t2;
}
huff (c-3,0,0);
out << lg << "\n";
for (i=0; i<n; i++)
out << lung[i] << " " << val[i] << "\n";
in.close();
out.close();
return 0;
}