# 最小函数值
## 题目描述
有 $n$ 个函数,分别为 $F_1,F_2,\dots,F_n$。定义 $F_i(x)=A_ix^2+B_ix+C_i(x\in\mathbb N*)$。给定这些 $A_i$、$B_i$ 和 $C_i$,请求出所有函数的所有函数值中最小的 $m$ 个(如有重复的要输出多个)。
## 输入格式
第一行输入两个正整数 n 和 m。
以下 n 行每行三个正整数,其中第 i行的三个数分别为 Ai、Bi 和 Ci。
## 输出格式
输出将这 n个函数所有可以生成的函数值排序后的前 m个元素。这 m个数应该输出到一行,用空格隔开。
## 样例 #1
### 样例输入 #1
```
3 10
4 5 3
3 4 5
1 7 1
```
### 样例输出 #1
```
9 12 12 19 25 29 31 44 45 54
```
## 提示
#### 数据规模与约定
对于全部的测试点,保证 1≤n,m≤10000,1≤Ai≤10,Bi≤100,Ci≤10000
思路:刚开始优先队列,直接暴力做的发现就对两个点,后来在内层循环加了个判断条件通过了,其实在每次函数从1循环到 m更新一下第m大的值在下一次函数循环时与第m大值比较就可以了
#include <iostream>
#include <queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> > q,f;
priority_queue<int,vector<int>,less<int> > s;
int main()
{
int n,m;
cin>>n>>m;
long long maxx=0;
for(int i=0;i<n;i++)
{
int a,b,c;
cin>>a>>b>>c;
if(maxx==0)
{
maxx=a*m*m+b*m+c;
}
for(int i=1;i<=m&&a*i*i+b*i+c<=maxx;i++)
{
long long sum;
sum=a*i*i+b*i+c;
q.push(sum);
s.push(sum);
if(s.size()==m)
{
f.push(s.top());
s.pop();
}
}
maxx=f.top();
}
for(int i=1;i<=m;i++)
{
cout<<q.top()<<' ';
q.pop();
}
return 0;
}