Pagini recente » Cod sursa (job #2755036) | Cod sursa (job #3227215) | Cod sursa (job #1675454) | Cod sursa (job #1491770) | Cod sursa (job #388267)
Cod sursa(job #388267)
#include<stdio.h>
struct huffman{long long v;
int s,d;}h[ 2000010 ];
long long n,m,i,j,L,v[ 1000010 ],q[ 1000010 ],c[ 1000010 ];
long long int lg[ 1000010 ];
void solve(){
long long i,j;
for(i =1,j = 1; i <= n || j < m;)
if(i <= n &&(j > m || v[i] < q[j])){
i++;if(i > n && j > m)break;
if(i <= n &&(j > m || v[i] < q[j]))
{m++;
q[m] = v[i-1];
q[m] += v[i];
h[n+m].s = i-1;
h[n+m].d = i;
i++;
}
else
{m++;
q[m] = v[i-1];
q[m] += q[j];
h[n+m].s = i-1;
h[n+m].d = n+j;
j++;}
L += q[m];
}
else
{j++;
if(i > n && j > m )break;
if(j <= m &&(i > n || q[j] < v[i]))
{m++;
q[m] = q[j-1];
q[m] += q[j];
h[n+m].s = n+j-1;
h[n+m].d = n+j;
j++;}
else
{m++;
q[m] = q[j-1];
q[m] += v[i];
h[n+m].s = n+j-1;
h[n+m].d = i;
i++;}
L += q[ m ];
}
}
void dfs(int nod,int lung,long long cod){
if(h[nod].v){lg[nod] = lung;c[nod] = cod;return;}
if(h[nod].s)
dfs(h[nod].s,lung+1,cod<<1);
if(h[nod].d)
dfs(h[nod].d,lung+1,(cod<<1)+1);
}
int main(){
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%lld",&n);
for(i = 1; i <= n; i++){
scanf("%lld",&v[i]);
h[i].v = v[i];
}
solve();
dfs(n+m,0,0);
printf("%lld\n",L);
for(i = 1; i <= n; i++)
printf("%lld %lld\n",lg[i],c[i]);
return 0;}