首页 > 代码库 > ?Luogu P2085 最小函数值

?Luogu P2085 最小函数值

P2085 最小函数值

题目描述

有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。

输入输出格式

输入格式:

 

输入数据:第一行输入两个正整数n和m。以下n行每行三个正整数,其中第i行的三个数分别位Ai、Bi和Ci。Ai<=10,Bi<=100,Ci<=10 000。

 

输出格式:

 

输出数据:输出将这n个函数所有可以生成的函数值排序后的前m个元素。这m个数应该输出到一行,用空格隔开。

 

输入输出样例

输入样例#1:
3 104 5 33 4 51 7 1
输出样例#1:
9 12 12 19 25 29 31 44 45 54

说明

数据规模:n,m<=10000

 

Solution

//先计算出x=1时候的情况存Heap里
//然后每次找最小时,插入当前的最小的所属的函数f[i](x+1)到root ,然后维护小根堆
(为什么?根据不等式的性质if a<b then a*c<b*c while c>0)
//w记录当前的函数最大的x
//name[i]表示第I个节点的是第几个函数

//insert插入一个新元素到堆,然后维护堆的性质,这里是维护小根堆
//get得到当前最小值就是root,然后删掉把最后的一个元素作为root然后维护小根堆

 1 program wonder; 2 const 3   inf=minval.in; 4   outf=minval.out; 5 var 6   len,i,j,n,tmp,ans,m:longint; 7   heap,w,a,b,c,name:array[0..10000] of longint; 8  9 procedure swap(var aa,bb:longint);10 var t:longint;11 begin12   t:=aa;  aa:=bb;  bb:=t;13 end;14 15 procedure insert(tmp:longint);16 var17   i:longint;18 begin19   inc(len);20   heap[len]:=tmp; name[len]:=len;21   i:=len;22   while (i>1) and (heap[i div 2]>heap[i]) do23   begin24     swap(heap[i],heap[i div 2]);25     swap(name[i],name[i div 2]);26     i:=i div 2;27   end;28 end;29 30 procedure ch;31 var32  dad,son:longint;33  stop:boolean;34 begin35   write(heap[1], );36   inc(w[name[1]]);37   heap[1]:=w[name[1]]*w[name[1]]*a[name[1]]+w[name[1]]*b[name[1]]+c[name[1]];38   dad:=1;39   stop:=false;40   while ((dad*2+1<=len) or (dad*2<=len)) and (not stop) do41   begin42    if (heap[dad*2+1]>heap[dad*2]) or (dad*2+1>len) then43     son:=dad*244     else son:=dad*2+1;45    if heap[dad]<=heap[son] then stop:=true46     else begin47            swap(heap[dad],heap[son]);48            swap(name[dad],name[son]);49            dad:=son;  //!!!!50          end;51   end;52 end;53 54 begin55   assign(input,inf);  assign(output,outf);56   reset(input);   rewrite(output);57 58   readln(n,m);59   for i:= 1 to n do60   begin61     read(a[i],b[i],c[i]);62     tmp:=a[i]+b[i]+c[i];63     w[i]:=1;64     insert(tmp);65   end;66 67   for i:= 1 to m do ch;68 69   close(input); close(output);70 end.

 

?Luogu P2085 最小函数值