北理 Problem H. 白学串

北理 Problem H. 白学串


2019年11月29号一个蒟蒻诞生了。

龙老师特别擅长出各种奇奇怪怪而且很难的题目。今天龙老师又想了一道好玩的题目。
白学家龙老师有一个数字序列 a1, a2, · · · , an,定义这个序列的子串是序列中的连续一段,也就是ax, ax+1, · · · , ay−1, ay (1 ≤ x ≤ y ≤ n)。定义一个子串是白学的,当且仅当这个子串中存在 3 个元素ai, aj , ak (x ≤ i, j, k ≤ y) 能够以它们为边长组成一个合法的三角形。现在龙老师想知道,对于他询问的每个子串,那些是白学串。
Input
第一行输入一个正整数 T (1 ≤ T ≤ 100),表示数据组数。输入保证 ∑n ≤ 5 × 105,∑m ≤ 106。
接下来 T 组数据,每组数据第一行输入两个正整数 n, m (1 ≤ n ≤ 105, 1 ≤ m ≤ 2 × 105) 由空格分
隔开,分别表示数字序列长度和询问数。
第二行输入 n 个正整数,由空格间隔开,其中第 i 个正整数是 ai (1 ≤ ai ≤ 108),描述这个序列。
接下来 m 行,每行输入两个正整数 l 和 r (1 ≤ l ≤ r ≤ n) 由空格分隔开,表示龙老师想问你:从第
l 个到第 r 个数组成的子串 a[l · · · r] 是不是白学的。
Output
对于每组数据,请输出 m 行,表示 m 个询问的答案。如果这个子串是白学的,请输出 yes,否则
请输出 no。
Example
standard input
2
5 3
1 1 2 3 4
1 3
2 4
2 5
5 2
2 3 4 1 2
1 4
3 5
standard output
no
no
yes
yes
no
题解
斐波那契数之间是无法构成三角形;所以我们可以尝试列举一下。
列举结果如下:
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
2971215073
4807526976
7778742049
12586269025
在第51项开始超过题目给定的范围,所以当询问的区间大于50,则必定能构成三角形;剩下的则暴力排序判断。
输出建议用scanf和printf,而不是用cin和cout,因为打印过多,用cin和cout浪费效率。

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int a[N],b[51];
bool judge(int z,int r){
	int len=r-z+1;
	if(len<3)
		return false; 
	for(int i=0;i<len;i++)
		b[i]=a[z+i-1];
	sort(b,b+len);
	for(int i=2;i<len;i++)
		if(b[i]<b[i-1]+b[i-2]) 
			return true;
	return false;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		int m,n,z,r;
		cin>>m>>n;
		for(int i=0;i<m;i++)
			scanf("%d",&a[i]);
		for(int i=1;i<=n;i++){
			scanf("%d %d",&z,&r); 
			if(r-z+1>51)
				printf("yes\n");
			else if(judge(z,r))
				printf("yes\n");
			else
				printf("no\n");
		}
	}
	return 0;
}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值