思路:方程无解的条件式(b-k)^2-4ac<0,所以只要找到最小的k,如果小于0,则有解,如果大于等于0,则一定无解,所以只要二分找到第一个大于等于b的k,然后判断两边最近的k,是否满足判别式。
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e6 + 5;
vector<ll> k;
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t; cin >> t;
while (t--) {
k.clear();
int n, m; cin >> n >> m;
for (int i = 0; i < n; i++) {
ll x; cin >> x; k.push_back(x);
}
sort(k.begin(), k.end());
for (int i = 0; i < m; i++) {
ll a, b, c; cin >> a >> b >> c;
auto it = lower_bound(k.begin(), k.end(), b);
if (it != k.end()) {
ll x = *it;
if ((b - x) * (b - x) - 4 * a * c < 0) {
cout << "YES" << endl;
cout << x << endl;
continue;
}
}
if (it != k.begin()) {
it--;
ll x = *it;
if ((b - x) * (b - x) - 4 * a * c < 0) {
cout << "YES" << endl;
cout << x << endl;
continue;
}
}
cout << "NO" << endl;
}
}
}