Pagini recente » Cod sursa (job #2860829) | Cod sursa (job #1091924) | Cod sursa (job #26997) | Cod sursa (job #2918667) | Cod sursa (job #389069)
Cod sursa(job #389069)
#include <cstdio>
#define file_in "huffman.in"
#define file_out "huffman.out"
#define Nmax 1010100
struct huffman
{
long long f;
int st,dr;
}
h[2*Nmax];
int n,m;
long long l,lg[Nmax],b[Nmax];
long long c[Nmax],v[Nmax];
void dfs(int nod, int Lg, long long niv)
{
if (h[nod].f)
{
lg[nod]=Lg;
b[nod]=niv;
return ;
}
//if (h[nod].st)
dfs(h[nod].st,Lg+1,(niv<<1));
//if (h[nod].dr)
dfs(h[nod].dr,Lg+1,(niv<<1)+1);
}
void solve()
{
int i,j;
i=1;
j=1;
m=0;
while(i<=n || j<=m)
{
if (i<=n && (j>m || v[i]<c[j]))
{
i++;
if (i>n && j>m)
break;
if (i<=n && (j>m || v[i]<c[j]))
{
c[++m]=v[i-1]+v[i];
h[m+n].st=i-1;
h[m+n].dr=i;
h[m+n].f=0;
i++;
l+=c[m];
}
else
{
c[++m]=v[i-1]+c[j];
h[m+n].st=i-1;
h[m+n].dr=j+n;
h[m+n].f=0;
j++;
l+=c[m];
}
}
else
{
j++;
if (i>n && j>m)
break;
if (j<=m && (i>n || v[i]>c[j]))
{
c[++m]=c[j-1]+c[j];
h[m+n].st=j-1+n;
h[m+n].dr=j+n;
h[m+n].f=0;
j++;
l+=c[m];
}
else
{
c[++m]=c[j-1]+v[i];
h[m+n].st=j-1+n;
h[m+n].dr=i;
h[m+n].f=0;
i++;
l+=c[m];
}
}
}
}
int main()
{
int i;
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d", &n);
for (i=1;i<=n;++i)
{
scanf("%lld", &v[i]);
h[i].f=v[i];
}
solve();
dfs(n+m,0,0);
printf("%lld\n", l);
for (i=1;i<=n;++i)
printf("%lld %lld\n", lg[i], b[i]);
fclose(stdin);
fclose(stdout);
return 0;
}