Pagini recente » Cod sursa (job #861760) | Cod sursa (job #1544808) | Cod sursa (job #906089) | Cod sursa (job #2019502) | Cod sursa (job #2495064)
#include <fstream>
#include <iostream>
#include <climits>
#define x first
#define y second
#define dim 1000010
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
long long n,i,j,v[2*dim],k,t,m,niv;
pair<int,int> l[2*dim]; ///fii
long long H[dim],C[dim],sum;
void dfs(long long nod, long long cod){
niv++;
if(nod<=k){
C[nod]=cod;
H[nod]=niv;
sum+=H[nod]*v[nod];
}else{
dfs(l[nod].x,(cod<<1));
dfs(l[nod].y,(cod<<1)+1);
}
niv--;
}
int main(){
fin>>n;
for(i=1;i<=n;i++){
fin>>v[i];
v[i+n]=LONG_LONG_MAX;
}
v[2*n+1]=v[2*n+2]=LONG_LONG_MAX;
t=2*n-1;
k=n;
i=1; j=n+1;
while(n<t){
if(v[i+1]<=v[j]){
v[++n]=v[i]+v[i+1];
///v[i]=v[i+1]=LONG_LONG_MAX;
l[n]=make_pair(i,i+1);
i+=2;
continue;
}
if(v[j+1]<=v[i]){
v[++n]=v[j]+v[j+1];
v[j]=v[j+1]=LONG_LONG_MAX;
l[n]=make_pair(j,j+1);
j+=2;
continue;
}
v[++n]=v[i]+v[j];
v[j]=LONG_LONG_MAX;
l[n]=make_pair(i,j);
i++; j++;
}
// for(i=1;i<=t;i++)
// cout<<l[i].x<<" "<<l[i].y<<"\n";
niv=-1;
dfs(t,0);
fout<<sum<<"\n";
for(i=1;i<=k;i++)
fout<<H[i]<<" "<<C[i]<<"\n";
return 0;
}