Pagini recente » Cod sursa (job #1794476) | Cod sursa (job #2522419) | Cod sursa (job #2437532) | Cod sursa (job #1356571) | Cod sursa (job #1554576)
#include <fstream>
#define ll long long
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
ll n,lg[1000005],s[1000005],d[1000005];
ll a[1000005],c[1000005];
int main()
{
int i,b1,b2,e1,e2,sum=0;
in>>n;
for(i=0;i<n;i++) in>>a[i];
b1=0;
b2=n;
e1=n;
e2=n;
while(b1<n)
{
if((b2==e2) || (e1-b1>1 && e2>b2 && a[b1+1]<=a[b2]))
{
a[e2]=a[b1]+a[b1+1];
s[e2]=b1;
d[e2]=b1+1;
e2++;
b1+=2;
}else if((b1==e1) || (e2-b2>1 && e1>b1 && a[b2+1]<=a[b1]))
{
a[e2]=a[b2]+a[b2+1];
s[e2]=b2;
d[e2]=b2+1;
e2++;
b2+=2;
}else{
a[e2]=a[b1]+a[b2];
s[e2]=b1;
d[e2]=b2;
e2++;
b1++;
b2++;
}
}
while(e2<2*n-1)
{
a[e2]=a[b2]+a[b2+1];
s[e2]=b2;
d[e2]=b2+1;
e2++;
b2+=2;
}
for(i=e2-1;i>=n;i--)
{
c[s[i]]=2*c[i];
c[d[i]]=2*c[i]+1;
lg[s[i]]=lg[d[i]]=lg[i]+1;
sum+=a[i];
}
out<<sum<<"\n";
for(i=1;i<=n;i++) out<<lg[i]<<" "<<c[i]<<"\n";
in.close();
out.close();
return 0;
}