Codeforces Global Round 19 E. Best Pair

\(cnt\)的取值种类数不超过\(\sqrt n\)。因此我们可以枚举\(cnt\) 然后贪心选最大的值。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;


#define int i64

using 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;
}

posted @ 2024-10-02 18:02  PHarr  阅读(3)  评论(0编辑  收藏  举报