E. Best Pair

时间:2023-03-18
本文章向大家介绍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;
}

原文地址:https://www.cnblogs.com/basicecho/p/17229222.html