E. Best Pair

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;
}
posted @   basicecho  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示