题目传送门
一个优先队列的水题。
题目大意就是给出几个二次函数,并按照从小到大的顺序输出它们所能的函数值($x$ 是正整数)

毕竟 $a, b, c$ 都是正整数,所以当 $x$ 是正整数时,$x=1$,$f(1)$ 取得最小值。

我们可以把函数值存入一个优先队列中,当然先取出的应该是最小值。(善用 STL)
像这样定义一个优先队列 priority_queue<func, vector<func>, greater<func> > que;
然后每次取出最小值输出并弹出,然后再压入 $f(x+1)$,如此往复。
定义一个结构体存函数,分别存函数的编号、自变量、函数值。

struct func {
    int id, x, val;
};

记得重载运算符,不然优先队列会出锅。

bool operator <(func a, func b) {
    return a.val < b.val;
}
bool operator >(func a, func b) {
    return a.val > b.val;
}

完整版

#include <bits/stdc++.h>
using namespace std;
const int maxN = 1e4 + 5;
struct func {
    int id, x, val;
};
bool operator <(func a, func b) {
    return a.val < b.val;
}
bool operator >(func a, func b) {
    return a.val > b.val;
}
priority_queue<func, vector<func>, greater<func> > que;
int a[maxN], b[maxN], c[maxN];
int n, m;
int f(int i, int x) {
    return a[i] * x * x + b[i] * x + c[i];
}
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i] >> b[i] >> c[i];
        func tmp = (func){i, 1, f(i, 1)};
        que.push(tmp);
    }
    for (int i = 1; i <= m; i++) {
        func t = que.top();
        cout << t.val << ' ';
        que.pop();
        func tmp = (func){t.id, t.x + 1, f(t.id, t.x + 1)};
        que.push(tmp);
    }
    return 0;
}

然而这道题数据过水,完全可以暴力 $O(mn)$ 跑出来强行循环 m 次,每次比较 n 个函数值,找出最小的并输出。