题目大意:
在很多个函数a[i]*x^2+b[i]*x+c[i],求出最小的M个。
堆:
1.将x=1时的全部函数加入堆里建立一个堆。
2.每次找最小的函数输出,然后把这个函数的x+1的结果加入堆,排序。
时间复杂度:O(N+M)
var
a:array [0..10001,1..3] of longint;
f,b:Array [0..10001] of longint;
n,m,i,j,ans:longint;
procedure down(x:longint);
begin
repeat
x:=x*2;
if x<n then
if f[x]>f[x+1] then inc(x);
if f[x div 2]>f[x]
then begin
f[0]:=f[x div 2];
f[x div 2]:=f[x];
f[x]:=f[0];
a[0]:=a[x div 2];
a[x div 2]:=a[x];
a[x]:=a[0];
b[0]:=b[x div 2];
b[x div 2]:=b[x];
b[x]:=b[0];
end
else break;
until x*2>n;
end;
begin
readln(n,m);
for i:=1 to n do
begin
for j:=1 to 3 do
begin
read(a[i,j]);
f[i]:=f[i]+a[i,j];
end;
b[i]:=1;
end;
for i:=n div 2 downto 1 do down(i);
for i:=1 to m do
begin
write(f[1],' ');
inc(b[1]);
f[1]:=a[1,1]*b[1]*b[1]+a[1,2]*b[1]+a[1,3];
down(1);
end;
end.