洛谷 P2085 最小函数值(minval)

来源:互联网 发布:centos 安装spine 编辑:程序博客网 时间:2024/06/16 09:51

题目大意:
在很多个函数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.
0 1