Hrbust 2373 小C的问题

BUG反馈门:点击打开链接

小C的问题

 
Time Limit: 1000 MSMemory Limit: 256000 K
Total Submit: 12(11 users)Total Accepted: 6(6 users)Rating:Special Judge: No
Description

C是一个可爱的女孩,她特别喜欢世界上最稳定的图形:三角形。有一天她得到了n根木棍,她把这些木棍随意的摆放成一行。小K来和小C玩,他发现了这排木棍,突然想知道在一段区间[l,r]之间的木棍(即第L根到第R根木棍)是否可以组成一个三角形,小C表示她不会,所以请你帮忙。

Input

数据只有一组。

第一行只有一个数字N,代表一共有N根木棍,N<=100000

第二行为N个数,代表每根木棍的长度。每根木棍的大小不超过1e18

第三行为一个数字Q,代表询问数目,Q<=100000

接下来的Q行,每一行有两个数字LR,代表询问的区间。其中LR满足1<=L<=R<=N

Output

对于每个询问,如果可以组成三角形输出Yes,否则输出No(不需要加引号)。

Sample Input

5

3 1 2 4 5

2

1 3

1 5

Sample Output

No

Yes

Source
"科林明伦杯"哈尔滨理工大学第八届程序设计竞赛
#include <iostream>
#include <algorithm>
#include <cstdio>
#define  ll long long
using namespace std; 
 
const int maxn=1e5+7;
ll a[maxn],b[80];

bool judge(ll l,ll r){
	int len=r-l+1;
	if(len<3) return false; 
	for(int i=0;i<len;i++){
		b[i]=a[l+i];
	}
	sort(b,b+len);
	for(int i=2;i<len;i++){
		if(b[i]<b[i-1]+b[i-2]) return true;
	}
	return false;
}

/**
a+b>c;

将区间数字分为3块,设想一下必为三角形的情况,就是数字个数到达一定量之后,任性组都能够组层一个三角形;
再看一下数据量,1e18 ,中间存在一个不断求和的过程,所以我们可以联想到斐波那契数列值到达1e18的情况,打表后发现,80就已经超过了 

所以木棍数大于80的情况下一定是可以组成三角形的;

那么我们现在考虑小于80的情况,根据a+b>c&&a+c>b,如果我们对数字进行排序后,只需要判断相邻三个数a,b,c---->a+b>c即可; 

*/


int main (){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	int m;
	cin>>m;
	while(m--){
		ll l,r;
		scanf("%lld %lld",&l,&r);
		if(r-l+1>80) puts("Yes");
		else if(judge(l,r)) puts("Yes");
		else puts("No");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值