Pagini recente » Cod sursa (job #1231939) | Cod sursa (job #1362093) | Cod sursa (job #1124255) | Cod sursa (job #733698) | Cod sursa (job #474103)
Cod sursa(job #474103)
#include <cstdio>
#include <cstring>
#define file_in "huffman.in"
#define file_out "huffman.out"
#define nmax 1010001
int n;
int lung[nmax];
long long ap[nmax];
long long len;
struct huffman
{
int val,fs,fd;
}
nod[2*nmax];
void citire()
{
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d", &n);
for (int i=1;i<=n;++i)
{
scanf("%d", &nod[i].val);
}
}
void dfs(int q, int x, long long val)
{
if (nod[q].fs)
{
dfs(nod[q].fs,x+1,2*val);
dfs(nod[q].fd,x+1,2*val+1);
return ;
}
lung[q]=x;
ap[q]=val;
len+=x*nod[q].val;
}
void solve()
{
int q1=1,q;
int q2=n+1;
int i=n;
long long x;
while(q1<n || q2<i)
{
++i;
nod[i].val=0;
if (q1<=n && (q2>=i || nod[q1].val<=nod[q2].val))
{
x=nod[q1].val;
q=q1;
q1++;
}
else
{
x=nod[q2].val;
q=q2;
q2++;
}
nod[i].val+=x;
nod[i].fs=q;
if (q1<=n && (q2>=i || nod[q1].val<=nod[q2].val))
{
x=nod[q1].val;
q=q1;
q1++;
}
else
{
x=nod[q2].val;
q=q2;
q2++;
}
nod[i].val+=x;
nod[i].fd=q;
}
dfs(i,0,0);
printf("%lld\n", len);
for (i=1;i<=n;++i)
printf("%d %lld\n", lung[i], ap[i]);
}
int main(){
citire();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}