\(cnt\)的取值种类数不超过\(\sqrt n\)。因此我们可以枚举\(cnt\) 然后贪心选最大的值。
#include <bits/stdc++.h>using namespace std;using i32 = int32_t;
using i64 = long long;#define int i64using vi = vector<int>;
using pii = pair<int,int>;void solve() {int n, m;cin >> n >> m;map<int,int> cnt;for(int i = 1, x; i <= n; i ++) cin >> x, cnt[x] ++;map<int,vi> C;for(const auto &[x, y]: cnt)C[y].push_back(x);for(auto &[x, y] : C)ranges::sort(y, greater<>());set<pii> vis;for(int x, y; m; m --) {cin >> x >> y;vis.emplace(x, y);}int res = 0;for(const auto &[x , y] : C) {if(y.size() < 2) continue;int ret = 0;for(const auto &i : y) for(const auto &j: y){if(j <= i) break;if(i + j <= ret) break;if(vis.count({i, j})) continue;ret = max(ret, i + j);res = max(res , (x + x) * (i + j));}}for(const auto &[a, x] : C) for(const auto &[b , y] : C){if(b >= a) break;int ret = 0;for(const auto &i : x)for(const auto &j : y) {if(i + j <= ret) break;if(i < j) {if(vis.count({i, j})) continue;} else {if(vis.count({j, i})) continue;}ret = max(ret, i + j);res = max(res, (a + b) * (i + j));}}cout << res << "\n";return;
}i32 main(){ios::sync_with_stdio(false), cin.tie(nullptr);int T;cin >> T;while(T --) solve();return 0;
}