链接 :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;
}