E. Best Pair
大意
找到最大的f(x,y)=(cntx+cnty)*(x+y)
切x,y不能是禁止的对数
按照cnt进行分类
代码
/*
(cntx+cnty)*(x+y) 求这个的最大值
并且x,y不能是特定的对
不T?
按照cnt进行分类,最多有sqrt(n)中cnt
所以前面两个循环时n的复杂度
然后就是bfs中,虽然会把所有的都枚举一次,但是m时有限的,所以每次枚举的次数是有限的
*/
#include <bits/stdc++.h>
using namespace std;
const int M = 1e6 + 5;
#define endl '\n'
#define int long long
using pii = pair<int, int>;
map<int,int>mp;
map<int,vector<int>>v;
set<pii>se;
int n,m;
int bfs(vector<int>v1,vector<int>v2) {
map<pii,bool>vis;//标记已经出现过的对数
priority_queue<array<int,3>>q;
int n1=v1.size(),n2=v2.size();
q.push({v1.back()+v2.back(),n1-1,n2-1});
while(!q.empty()) {
auto [val,x,y]=q.top();q.pop();
if(v1[x]!=v2[y]&&!se.count({v1[x],v2[y]}))return val;
if(x&&!vis[{x-1,y}]) {
q.push({v1[x-1]+v2[y],x-1,y});
vis[{x-1,y}]=1;
}
if(y&&!vis[{x,y-1}]) {
q.push({v1[x]+v2[y-1],x,y-1});
vis[{x,y-1}]=1;
}
}
return 0;
}
void solve() {
mp.clear();
v.clear();
se.clear();
cin>>n>>m;
for(int i=1,x;i<=n;i++)cin>>x,mp[x]++;
for(int i=1,x,y;i<=m;i++)cin>>x>>y,se.insert({x,y}),se.insert({y,x});
for(auto [x,y]:mp)v[y].push_back(x);
for(auto [x,y]:v)sort(y.begin(),y.end());
int ans=0;
for(auto [i,v1]:v)
for(auto [j,v2]:v) {
if(i>j)continue;
ans=max(ans,(i+j)*bfs(v1,v2));
}
cout<<ans<<endl;
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int TT; cin >> TT;
while(TT--) {
solve();
}
return 0;
}

浙公网安备 33010602011771号