Description
Cly很喜欢三角形,有一天他遇到了一道和三角形有关的题,但是这道题他简单了,他懒得做,于是交给了你。
给定一个数组,每次询问一个子区间,如果能从这个子区间挑出三个数组成三角形输出clynb
,否者输出clycdd
。
Input
第一行给出数组大小n
,查询次数q
(1<=n,q<=1e5
)
接下来一行输入n
个数,表示a[i]
(1<=a[i]<=1e9
)
接下来q
行,每行输入两个数l,r
,代表一个子区间 (1<=l,r<=n
)
Output
对于每个询问输出clynb
或者clycdd
Sample Input
5 3
2 1 4 3 5
1 2
1 3
3 5
Sample Output
clycdd
clycdd
clynb
题目分析:
首先尝试构造不能组成三角形的序列
由于数据有规模限制,我们要使序列中的数尽可能小,又恰好不能组成三角形
不难发现,序列是
1,1,2,3,5,8,13......
即斐波那契数列
由于a[i]<=1e9
,我们计算恰好小于等于1e9的斐波那契数是第44
项
long long a[100];
a[1]=1;a[2]=1;
for(int i=3;i<99;i++){
a[i]=a[i-1]+a[i-2];
if(a[i]>1e9){
cout<<i-1;//输出的是44
break;
}
}
因而
长度超过 44 的区间必然可以组成三角形
所以只需要对长度超过 44
的区间暴力判断是否能组成三角形
由于
排序后的序列,相邻的 3 项最可能组成三角形
所以
只需要对选中的区间排序,然后对相邻3
项判断即可
下面给出代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int n,q;
cin>>n>>q;
long long a[100010],b[100];
for(int i=0;i<n;i++)
cin>>a[i];
int l,r;
for(int i=0;i<q;i++){
scanf("%d%d",&l,&r);
l--;
r--;
if(r-l>50) printf("clynb\n");//这里稍微写大一点也可以
else if(r-l==1 or l==r) printf("clycdd\n");
else{
int cnt=0;
for(int j=l;j<=r;j++)
b[cnt++]=a[j];
sort(b,b+cnt);
bool flag=false;
for(int j=0;j<cnt-2;j++){
if(b[j]+b[j+1]>b[j+2]){
flag=!flag;
break;
}
}
if(flag) printf("clynb\n");
else printf("clycdd\n");
}
}
return 0;
}