BUG反馈门:点击打开链接
| ||||||
Description | ||||||
小C是一个可爱的女孩,她特别喜欢世界上最稳定的图形:三角形。有一天她得到了n根木棍,她把这些木棍随意的摆放成一行。小K来和小C玩,他发现了这排木棍,突然想知道在一段区间[l,r]之间的木棍(即第L根到第R根木棍)是否可以组成一个三角形,小C表示她不会,所以请你帮忙。 | ||||||
Input | ||||||
数据只有一组。 第一行只有一个数字N,代表一共有N根木棍,N<=100000。 第二行为N个数,代表每根木棍的长度。每根木棍的大小不超过1e18。 第三行为一个数字Q,代表询问数目,Q<=100000。 接下来的Q行,每一行有两个数字L和R,代表询问的区间。其中L和R满足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;
}