Pagini recente » Cod sursa (job #276668) | Cod sursa (job #140538) | Cod sursa (job #2921656) | Cod sursa (job #2776205) | Cod sursa (job #1917039)
#include <fstream>
#include <cstring>
#define nmax 1000005
using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");
pair <long long,pair <int,int> > p[nmax*2];
long long v[nmax],w[nmax],c[nmax],ans;
int n,m,h[nmax];
void dfs(int nod,int cod,int niv)
{
if (nod<=n) {
c[nod]=cod;
h[nod]=niv;
}
if (nod>n)
ans+=p[nod].first;
if (p[nod].first>0) {
dfs(p[nod].second.first,cod*2,niv+1);
dfs(p[nod].second.second,cod*2+1,niv+1);
}
}
int main()
{
int i,j,k;
memset(v,1,sizeof(v));
memset(w,1,sizeof(w));
f>>n;
for (i=1;i<=n;i++)
f>>v[i];
i=1,j=1;m=0;
for (k=n;k<2*n-1;) {
if (v[i+1]<w[j]) {
k++;
p[k]=make_pair(v[i]+v[i+1],make_pair(i,i+1));
m++;
w[m]=v[i]+v[i+1];
i+=2;
continue;
}
if (w[j+1]<v[i]) {
k++;
p[k]=make_pair(w[j]+w[j+1],make_pair(n+j,n+j+1));
m++;
w[m]=w[j]+w[j+1];
j+=2;
continue;
}
k++;
p[k]=make_pair(v[i]+w[j],make_pair(i,n+j));
m++;
w[m]=v[i]+w[j];
i++,j++;
}
dfs(2*n-1,0,0);
g<<ans<<'\n';
for (i=1;i<=n;i++)
g<<h[i]<<' '<<c[i]<<'\n';
return 0;
}