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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现