Codeforces Round #635 (Div. 2)D. Xenia and Colorful Gems(二分)

一切都会过去的

原题链接

昨晚div2的D题,赶巧C题算是个树形DP(也不算吧),比较好写,1个小时做完A,B,C,开始长达1个半小时的罚坐,D题一看过的人很少,大脑瞬间给自己的反馈是自己肯定做不出来,原来对自己已经这么没信心了

于是随便写了个假算法交上去,WA3,
然后闲的锁了A题,第一次hack别人
然后那个人的代码我出的数据在我自己本地跑了2s多,
一想肯定超时,于是hack了一下,失败,我倒扣50分,无语。。。
一看codeforces上才跑了15ms?????
低估了个人计算机和服务器的差距啊。。。。。

今天醒来,看到群友说昨天的D题是个二分,突然反应过来了,哎,昨晚也没仔细思考,1e5的数据,要么是O(n),要么是O(nlogn),而O(nlogn)首先就很容易想到二分。

三种颜色,首先定下一种颜色,其余两种颜色二分查找,不断更新最小值即可

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll r[100005],g[100005],b[100005];
ll query(ll x,ll y,ll z)
{
    
    return (x-y)*(x-y)+(x-z)*(x-z)+(y-z)*(y-z);}

int main()
{
    
    
    ll t,nr,ng,nb;
    scanf("%lld",&t);
    while(t--)
    {
    
    
        scanf("%lld %lld %lld",&nr,&ng,&nb);
        for(int i=0;i<nr;i++)
        {
    
    scanf("%lld",&r[i]);}
        for(int i=0;i<ng;i++)
        {
    
    scanf("%lld",&g[i]);}
        for(int i=0;i<nb;i++)
        {
    
    scanf("%lld",&b[i]);}
        sort(r,r+nr);
        sort(g,g+ng);
        sort(b,b+nb);
        ll ans=9223372036854775807;
        for(int i=0;i<nr;i++)
        {
    
    
            ll a1=lower_bound(g,g+ng,r[i])-g;
            if(a1==ng){
    
    a1=ng-1;}
            ll a2=lower_bound(b,b+nb,r[i])-b;
            if(a2==nb){
    
    a2=nb-1;}
            ans=min(ans,query(r[i],g[a1],b[a2]));
            if(a1!=0)
            {
    
    
                ans=min(ans,query(r[i],g[a1-1],b[a2]));
                if(a2!=0)
                {
    
    
                    ans=min(ans,query(r[i],g[a1-1],b[a2-1]));
                    ans=min(ans,query(r[i],g[a1],b[a2-1]));
                }
            }
            else
            {
    
    
                if(a2!=0)
                {
    
    ans=min(ans,query(r[i],g[a1],b[a2-1]));}
            }
        }
        for(int i=0;i<ng;i++)
        {
    
    
            ll a1=lower_bound(r,r+nr,g[i])-r;
            if(a1==nr){
    
    a1=nr-1;}
            ll a2=lower_bound(b,b+nb,g[i])-b;
            if(a2==nb){
    
    a2=nb-1;}
            ans=min(ans,query(g[i],r[a1],b[a2]));
            if(a1!=0)
            {
    
    
                ans=min(ans,query(g[i],r[a1-1],b[a2]));
                if(a2!=0)
                {
    
    
                    ans=min(ans,query(g[i],r[a1],b[a2-1]));
                    ans=min(ans,query(g[i],r[a1-1],b[a2-1]));
                }
            }
            else
            {
    
    
                if(a2!=0)
                {
    
    ans=min(ans,query(g[i],r[a1],b[a2-1]));}
            }
        }
        for(int i=0;i<nb;i++)
        {
    
    
            ll a1=lower_bound(r,r+nr,b[i])-r;
            if(a1==nr){
    
    a1=nr-1;}
            ll a2=lower_bound(g,g+ng,b[i])-g;
            if(a2==ng){
    
    a2=ng-1;}
            ans=min(ans,query(b[i],r[a1],g[a2]));
            if(a1!=0)
            {
    
    
                ans=min(ans,query(b[i],r[a1-1],g[a2]));
                if(a2!=0)
                {
    
    
                    ans=min(ans,query(b[i],r[a1],g[a2-1]));
                    ans=min(ans,query(b[i],r[a1-1],g[a2-1]));
                }
            }
            else
            {
    
    
                if(a2!=0)
                {
    
    ans=min(ans,query(b[i],r[a1],g[a2-1]));}
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43781431/article/details/105552844