Pagini recente » Cod sursa (job #2390619) | Cod sursa (job #2506248) | Cod sursa (job #365477) | Cod sursa (job #3158190) | Cod sursa (job #1831515)
#include <iostream>
#include <stdio.h>
using namespace std;/*
ifstream cin("huffman.in");
ofstream cout("huffman.out");*/
long long n,i,l,r,idx,cx,cy;
long long f[1000002],faux[1000002];
int fr[1000002];
long long solv[1000002];
int soll[1000002];
int st[1000002], dr[1000002], a[1000002], aux[1000002], x, y, root, counter;
void dfs(int root, int l, long long v)
{
if(dr[root]==-1)
{
soll[st[root]]=l;
solv[st[root]]=v;
}
else
{
dfs(st[root], l+1, (long long)2*v);
dfs(dr[root], l+1, (long long)2*v+(long long)1);
}
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
//cin>>n;
scanf("%d", &n);
for(i=1; i<=n; ++i)
{
// cin>>f[i];
scanf("%lld", &f[i]);
fr[i]=f[i];
}
f[n+1]=(long long)1000000000*(long long)1000000000;
for(i=1; i<=n; ++i)
{
++counter;
a[i]=counter;
st[i]=i;
dr[i]=-1;
}
l=1;
r=0;
idx=1;
while(n-idx+1+r-l+1>1)
{
if(l<=r && faux[l]<f[idx])
{
--idx;
f[idx]=faux[l];
a[idx]=aux[l];
++l;
}
x=a[idx];
cx=f[idx];
++idx;
if(l<=r && faux[l]<f[idx])
{
--idx;
f[idx]=faux[l];
a[idx]=aux[l];
++l;
}
y=a[idx];
cy=f[idx];
++idx;
++counter;
st[counter]=x;
dr[counter]=y;
++r;
faux[r]=cx+cy;
aux[r]=counter;
root=counter;
}
dfs(root,0,0);
long long suma=0;
for(i=1; i<=n; ++i)
suma+=(long long)fr[i]*soll[i];
//cout<<suma<<"\n";
printf("%lld\n", suma);
for(i=1; i<=n; ++i)
//cout<<soll[i]<<" "<<solv[i]<<"\n";
printf("%d %lld\n", soll[i],solv[i]);
return 0;
}