牛客小白月赛4 -三角形

链接 :https://www.nowcoder.com/acm/contest/134/A

代码
没啥技巧,直接把所有的的三角形周长存下了,然后删除一个点 i,他只会影响i i+1 i+2 点组成的三角,删除这三个三角,然后把新成的三角和最后一个比较就行了

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
#define inf 0x3f3f3f3f
long long  a[N];
long long  b[N];
long long  c[N];
int main()
{
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=a[i];
    }
    sort(b+1,b+n+1);
    c[0]=c[1]=c[2]=-1;
    for(int i=3;i<=n;i++)
    {
        c[i]=(b[i]<b[i-1]+b[i-2]?b[i]+b[i-1]+b[i-2]:-1LL);
    }

    sort(c,c+n+1);
    while(q--)
    {
        int k;
        cin>>k;
        long long vis[4];
        long long  ans=-10;
        vis[0]=vis[1]=vis[2]=0;
        int i=lower_bound(b+1,b+n+1,a[k])-b;

        if(n<=3) {cout<<"-1"<<endl;continue;}
        ans=max(ans,(i>2&&i<n&&b[i+1]<b[i-1]+b[i-2]?b[i+1]+b[i-1]+b[i-2]:-1LL));
        ans=max(ans,((i>1&&i<n-1)&&b[i+2]<b[i+1]+b[i-1]?b[i+2]+b[i+1]+b[i-1]:-1LL));
        long long  w[4];
        w[0]=w[1]=w[2]=-1;
        for(int j=0;j<3;i++,j++)
        if(b[i]<b[i-1]+b[i-2]&&i<=n&&i>2)
        {
            vis[j]=b[i]+b[i-1]+b[i-2];
            int o=lower_bound(c,c+n+1,vis[j])-c;
            while(c[o]==0) o++;
            c[o]=0;
            w[j]=o;

        }
        for(int j=n;j>=2;j--)
        {

            if(c[j]!=0)
            {
                ans=max(ans,c[j]);
                 break;

            }
        }
        for(int j=0;j<3;j++,i--)
        {
            if(vis[j])
            {
                c[w[j]]=vis[j];

            }
        }
      cout<< max(ans,-1LL)<<endl;



    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37493070/article/details/80726289