Codeforeces Gym - 101733D Triangle Construction [想法]

题意:给你n个数,m个询问,每次询问[L,R]范围内是否能够成三角形。

题解:我们可以得知,三角形不能成立的情况是斐波那契数列,由于a[i]最多是10^18次,所以最多包含91个数,所以对于区间长度是大于92的话,是必定有解,所以对于每个询问,最多取92个数,然后再sort这些数一次判就可以了。

AC代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node
{
	ll id,w;
	node(){}
	node(ll id,ll w)
	{
		this->id=id;
		this->w=w;
	}
}b[105];
bool operator<(node a,node b)
{
	return a.w<b.w;
}
ll a[300005],tot;
int main()
{
	ll n,m;
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	while(m--)
	{
		tot=0;
		ll l,r;
		scanf("%lld%lld",&l,&r);
		r=min(r,l+92);
		for(ll i=l;i<=r;i++)
			b[tot++]=node(i,a[i]);
		sort(b,b+tot);
		ll flag=0;
		for(ll i=0;i<tot-2;i++)
			if(b[i].w+b[i+1].w>b[i+2].w)
			{
				flag=1;
				printf("%lld %lld %lld\n",b[i].id,b[i+1].id,b[i+2].id);
				break;
			}
		if(!flag)printf("-1\n");
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值