蒟蒻WA on #8 求调
查看原帖
蒟蒻WA on #8 求调
625380
FriedrichC楼主2022/10/19 13:33
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define maxn 300010
using namespace std;
inline int read()
{
    int x=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    return x;
}
int a[maxn],b[maxn],cnt[maxn],ans;
map<pii,bool>mp;
vector<int>v[maxn],p1;//part1 数组,即cnt大于根号n那部分的数
inline bool check(int x,int y)
{
    if(x!=y&&!mp.count({x,y})&&!mp.count({y,x}))
        {ans=max(ans,(cnt[x]+cnt[y])*(b[x]+b[y]));return 1;}
    return 0;
}
signed main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ans=0;
        mp.clear(); p1.clear();
        int n,m;
        n=read(); m=read();
        for(int i=1;i<=n;++i)
        {
            b[i]=a[i]=read(),cnt[i]=0;
            v[i].clear();
        }
        sort(b+1,b+1+n);
        int num=unique(b+1,b+1+n)-b-1;
        int sq=sqrt(num);
        for(int i=1;i<=n;++i)
            a[i]=lower_bound(b+1,b+1+num,a[i])-b,cnt[a[i]]++;

        for(int i=1;i<=m;++i)
        {
            int u,v;
            u=read(); v=read();
            u=lower_bound(b+1,b+1+n,u)-b;
            v=lower_bound(b+1,b+1+n,v)-b;
            mp[{u,v}]=1;
        }

        //for(int i=1;i<=n;++i)printf("a[%d]=%d\n",i,a[i]);

        for(int i=1;i<=num;++i)
        {
            if(cnt[i]>sq)p1.push_back(i);
            else v[cnt[i]].push_back(i);
        }
        for(int i=1;i<=sq;++i)sort(v[i].begin(),v[i].end(),greater<int>());

        for(auto x:p1)
            for(auto y:p1)check(x,y);

        for(int i=1;i<=sq;++i)
            for(int j=sq;j>=i;--j)
                for(auto x:v[i])
                    for(auto y:v[j])
                        if(check(x,y))break;

        for(auto x:p1)
            for(int i=sq;i>=1;--i)
                for(auto y:v[i])
                    if(check(x,y))break;

        printf("%lld\n",ans);
    }
	return 0;
}

2022/10/19 13:33
加载中...