二分模板题

For a given sequence A={a0,a1,...,an−1}A = \{a_0, a_1, ..., a_{n-1}\}A={a0,a1,...,an1} which is sorted by ascending order, find a specific value kkk given as a query.

Input
The input is given in the following format.

nnn
a0  a1  ,...,  an−1a_0 \; a_1 \; ,..., \; a_{n-1}a0a1,...,an1
qqq
k1k_1k1
k2k_2k2
:
kqk_qkq
The number of elements nnn and each element aia_iai are given in the first line and the second line respectively. In the third line, the number of queries qqq is given and the following qqq lines, qqq integers kik_iki are given as queries.

Output
For each query, print 1 if any element in AAA is equivalent to kkk, and 0 otherwise.

Constraints
1≤n≤100,0001 \leq n \leq 100,0001n100,000
1≤q≤200,0001 \leq q \leq 200,0001q200,000
0≤a0≤a1≤...≤an−1≤1,000,000,0000 \leq a_0 \leq a_1 \leq ... \leq a_{n-1} \leq 1,000,000,0000a0a1...an11,000,000,000
0≤ki≤1,000,000,0000 \leq k_i \leq 1,000,000,0000ki1,000,000,000
Sample Input 1

4
1 2 2 4
3
2
3
5

Sample Output 1

1
0
0

题意:
从长度为n的非递减序列里查找q次,每次查1个数,如果找到输出1,否则输出0

#include<bits/stdc++.h>
using namespace std;
int a[100005];
bool f(int a[],int n,int x){
	 int l=0,r=n-1,m;
	 while(r>l){
	 	m=(l+r)>>1;
	 	if(a[m]==x) return true;
	 	else if(a[m]>x) r=m-1;
	 	else l=m+1;	 
	 }
	 if(a[l]==x) return true;
	 else return false;
}
int main(){
	int n,m,x;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	scanf("%d",&m);
	while(m--){
		scanf("%d",&x);
		if(f(a,n,x)) printf("1\n");
		else printf("0\n");
	}
	return 0;
}
二分查找模板是一种常见的算法,可以通过二分查找的思想来解决。在给定的代码中,使用了二分查找来寻找满足条件的最小值K。具体的实现步骤如下: 1. 首先定义一个函数check,用于检查在字符串s中长度为mid的所有子串是否是不重复的。在函数内部,使用unordered_set来存储已经出现过的子串,如果出现重复,则返回false,否则返回true。 2. 在主函数中,使用二分查找的方式来寻找最小的满足条件的K。初始化左边界l为1,右边界r为100。在while循环中,每次取中间值mid,并调用check函数来判断是否满足条件。 3. 如果check函数返回true,说明当前的K满足条件,将右边界r更新为mid,继续在左半部分寻找更小的值。 4. 如果check函数返回false,说明当前的K不满足条件,将左边界l更新为mid+1,继续在右半部分寻找满足条件的值。 5. 当左边界l和右边界r相等时,循环结束,此时的l即为最小的满足条件的K。 所以,给定的代码实现了一个二分查找模板,使用C++语言编写。它通过判断字符串中长度为mid的子串是否重复来寻找最小的满足条件的K值。 #### 引用[.reference_title] - *1* [推荐使用的二分查找模板](https://blog.youkuaiyun.com/justidle/article/details/104527596)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [二分查找例与模板(蓝桥杯复习+例讲解+模板c++)](https://blog.youkuaiyun.com/jj6666djdbbd/article/details/129773547)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值