Pagini recente » Monitorul de evaluare | Cod sursa (job #1271421) | Cod sursa (job #2471776) | Cod sursa (job #2325064) | Cod sursa (job #1701540)
#include <fstream>
using namespace std;
ifstream cin("huffman.in");
ofstream cout("huffman.out");
const int LIM=2000005;
int n, id=1, p, u, lvl=-1;
long long val, tot;
int readInt () {
bool minus = false;
int result = 0;
char ch;
ch = getchar();
while (true) {
if (ch == '-') break;
if (ch >= '0' && ch <= '9') break;
ch = getchar();
}
if (ch == '-') minus = true; else result = ch-'0';
while (true) {
ch = getchar();
if (ch < '0' || ch > '9') break;
result = result*10 + (ch - '0');
}
if (minus)
return -result;
else
return result;
}
struct nod
{
long long val;
int st, dr;
} arb[LIM];
struct cell
{
long long val;
int lvl;
} ans[LIM/2];
void preord(int nod)
{
lvl++;
if(nod<=n)
{
ans[nod].lvl=lvl;
ans[nod].val=val;
tot+=(long long)ans[nod].lvl*arb[nod].val;
lvl--;
return;
}
val<<=1;
preord(arb[nod].st);
val++;
preord(arb[nod].dr);
val>>=1;
lvl--;
}
int main()
{
freopen("huffman.in", "r", stdin);
//cin>>n;
n=readInt();
for(int i=1; i<=n; ++i)
//cin>>arb[i].val;
arb[i].val=readInt();
p=n+1, u=n;
for(int i=1; i<n; ++i)
{
int fius, fiud;
if(p>u or (id<=n and arb[id].val<arb[p].val))
fius=id, id++;
else
fius=p, p++;
if(p>u or (id<=n and arb[id].val<arb[p].val))
fiud=id, id++;
else
fiud=p, p++;
u++;
arb[u].val=arb[fius].val+arb[fiud].val;
arb[u].st=fius;
arb[u].dr=fiud;
}
preord(2*n-1);
cout<<tot<<'\n';
for(int i=1; i<=n; ++i)
cout<<ans[i].lvl<<' '<<ans[i].val<<'\n';
return 0;
}