接下来考虑 M \le N 的情况。根据前文,我们已经知道了 \min L 只取决于 \max B 和 \min B;所以使 L 尽可能小,要么让 \max B 尽可能小,要么让 \min B 尽可能大。
将 A 升序排列后,枚举左端点 l,令右端点为 r = l + M - 1,选取 A_{[l, r]} 这一段元素作为 B。此时有 \min B = A_l,\max B = A_{r};显然有 A_r \le A_{r+1} \le \dots 从而 \max B 已经够小了,由于必须恰好选 M 张画所以 r 也不能再小了。只需对所有可能的 l 都计算一次 L,选出最小的那个即可。
参考代码
#include <algorithm>
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::vector;
using u64 = unsigned long long;
int main() {
size_t n, m;
cin >> n >> m;
vector<u64> a(n);
for(u64 &x : a) cin >> x;
std::sort(a.begin(), a.end());
u64 minimum = 1'000'000'000'000ull;
for(size_t L = 0; L + m <= n; ++L) {
size_t R = L + m - 1;
minimum = std::min(minimum, a[R] * a[R] - a[L] * a[L]);
}
cout << minimum;
return 0;
}