Pagini recente » Cod sursa (job #53732) | Cod sursa (job #592490) | Cod sursa (job #988061) | Cod sursa (job #958223) | Cod sursa (job #1193075)
#include <iostream>
#include <fstream>
using namespace std;
//ifstream fin("huffman.in");
//ofstream fout("huffman.out");
FILE *fin=fopen("huffman.in", "r");
FILE *fout=fopen("huffman.out", "w");
#define MAX 1000005
struct node{
long long val;
int st, dr;
};
node *p;
node nod[2*MAX];
int Q1[MAX], Q2[MAX], st1, dr1, st2, dr2;
int n, i, x;
int take_min()
{
int x;
if(st1>=dr1)
{
x=Q2[st2];
st2++;
return x;
}
if(st2>=dr2)
{
x=Q1[st1];
st1++;
return x;
}
if(nod[Q2[st2]].val<nod[Q1[st1]].val)
{
x=Q2[st2];
st2++;
return x;
}
x=Q1[st1];
st1++;
return x;
}
long long nr;
int lg;
int ln[MAX];
long long number[MAX];
void df(int rad)
{
if(!nod[rad].st)
{
ln[rad]=lg;
number[rad]=nr;
return;
}
lg++;
nr*=2;
df(nod[rad].st);
nr++;
df(nod[rad].dr);
nr/=2;
lg--;
}
int main()
{
int d=0;
fscanf(fin, "%d", &n);
//fin>>n;
for(i=1;i<=n;i++)
{
++d;
//fin>>x;
fscanf(fin, "%d", &x);
nod[d].val=x;
Q1[dr1++]=d;
}
//fin.close();
int i1, i2;
long long s=0;
for(i=1;i<n;i++)
{
i1=take_min();
i2=take_min();
d++;
nod[d].val=nod[i1].val+nod[i2].val;
nod[d].st=i1;
nod[d].dr=i2;
s+=nod[d].val;
Q2[dr2++]=d;
}
df(d);
//fout<<s<<"\n";
fprintf(fout, "%lld\n", s);
for(i=1;i<=n;i++)
{
// cout<<ln[i]<<" "<<number[i]<<"\n";
fprintf(fout, "%d %lld\n", ln[i], number[i]);
}
//fout.close();
}