Pagini recente » Cod sursa (job #509185) | Cod sursa (job #2925798) | Cod sursa (job #35102) | Cod sursa (job #2036283) | Cod sursa (job #721399)
Cod sursa(job #721399)
var v,st,dr,l:array[0..1000005] of longint;
v2,b:array[0..1000005] of int64;
min:array[1..2] of longint;
n,i,j,k1,k2:longint;
sol:int64;
s:string;
f,g:text;
bufin:array[1..65000] of byte;
procedure rec(nod,lev:longint;nr:int64);
begin
if nod<=n then
begin
l[nod]:=lev;
b[nod]:=nr;
inc(sol,v[nod]*lev);
end
else
begin
rec(st[nod-n],lev+1,nr shl 1);
rec(dr[nod-n],lev+1,(nr shl 1) or 1);
end;
end;
procedure citire(var a:longint);
var c:byte;
begin
c:=1;
while c<=length(s) do
begin
a:=a*10+ord(s[c])-48;
inc(c);
end;
end;
begin
assign(f,'huffman.in');
assign(g,'huffman.out');
reset(f);rewrite(g);
settextbuf(f,bufin);
readln(f,s);
citire(n);
for i:=1 to n do
begin
readln(f,s);
citire(v[i]);
end;
k1:=1;
k2:=1;
for i:=1 to n-1 do
begin
for j:=1 to 2 do
if (k1<=n) and (k2<=i-1) then
if v[k1]<v2[k2] then
begin
min[j]:=k1;
inc(k1);
end
else
begin
min[j]:=k2+n;
inc(k2);
end
else
if k1<=n then
begin
min[j]:=k1;
inc(k1);
end
else
begin
min[j]:=k2+n;
inc(k2);
end;
if min[1]<=n then
v2[i]:=v[min[1]]
else
v2[i]:=v2[min[1]-n];
if min[2]<=n then
v2[i]:=v2[i]+v[min[2]]
else
v2[i]:=v2[i]+v2[min[2]-n];
st[i]:=min[1];
dr[i]:=min[2];
end;
rec((n shl 1)-1,0,0);
writeln(g,sol);
for i:=1 to n do
writeln(g,l[i],' ',b[i]);
close(f);close(g);
end.