Aizu ITP2_6_A(二分模板)

For a given sequence $A = \{a_0, a_1, ..., a_{n-1}\}$ which is sorted by ascending order, find a specific value $k$ given as a query.

Input

The input is given in the following format.

$n$
$a_0 \; a_1 \; ,..., \; a_{n-1}$
$q$
$k_1$
$k_2$
:
$k_q$

The number of elements $n$ and each element $a_i$ are given in the first line and the second line respectively. In the third line, the number of queries $q$ is given and the following $q$ lines, $q$ integers $k_i$ are given as queries.

Output

For each query, print 1 if any element in $A$ is equivalent to $k$, and 0 otherwise.

Constraints

  • $1 \leq n \leq 100,000$
  • $1 \leq q \leq 200,000$
  • $0 \leq a_0 \leq a_1 \leq ... \leq a_{n-1} \leq 1,000,000,000$
  • $0 \leq k_i \leq 1,000,000,000$

Sample Input 1

4
1 2 2 4
3
2
3
5

Sample Output 1

1
0
0


题意:如果序列中有元素k则输出1,否则输出0。

思路:二分模板题。见代码。

疑惑:可能是这个题测试数据比较水,不排序也能过。


 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int N;
 5 long long a[100005];
 6
 7 int find(long long x,int l,int r){
 8     int m=(r+l)>>1;
 9     while(r>=l){
10         if(x==a[m]) return 1;
11         else if(x<a[m]) r=m-1;
12         else  l=m+1;
13
14         m=(r+l+1)>>1;
15     }
16 return 0;
17 }
18
19 int main(){
20     int Q;
21     long long x;
22
23     cin>>N;
24     for(int i=0;i<N;i++)
25         cin>>a[i];
26     sort(a,a+N);
27     cin>>Q;
28     while(Q--){
29         cin>>x;
30         cout<<find(x,0,N-1)<<endl;
31     }
32     return 0;
33 }

原文地址:https://www.cnblogs.com/yzhhh/p/10048847.html

时间: 2024-10-29 21:54:17

Aizu ITP2_6_A(二分模板)的相关文章

Honk&#39;s pool(二分模板题)

题意:有n个水池,每个水池有a[i]单位水,有k次操作,每次操作将水量最多的水池减少一单位水,水量最少的水池增加一单位水,问最后水量最大的水池和水量最少的水池相差的水量. 思路:二分最后的最大水量和最小水量,特别的,模拟一下可以发现如果总水量sum%n==0,则最大值的下界和最小值的上界均为sum/n,若sum%n!=0,则最大值的下界为sum/n+1,最小值上界为sum/n.二分时注意选取区间是左闭右开还是左开右闭. #include <iostream> #include <algo

二分模板// The Frog&#39;s Games +Aggressive cows

  二分的情况不同所输出的模板也不同列如下面两个题目                                                    The Frog's Games   代码如下               //二分专练                                                #include <stdio.h> //lower_bound大于等于它的第一个数                                     

二分模板

从卿学姐那里偷来的模板 (整数二分  待更新更加高级的 int left = 0,ri =maxn; while (left <= ri) { int mid = (left + ri)/2; if( check(mid) ) ans=mid,left = mid+1; else ri= mid-1; } cout << ans <<endl;

AcWing 789. 数的范围 二分+模板

https://www.acwing.com/problem/content/791/ #include<bits/stdc++.h> using namespace std; const int N=100010; int n,m; int q[N]; int main() { scanf("%d%d",&n,&m); for(int i=0; i<n; i++) scanf("%d",&q[i]); while(m--)

UVAlive7501 Business Cycle 2015ECfinal B(二分模板)

题意:给你一个环,环有n个点,编号0~n-1,每个点有一定的权值,从点0出发沿编号走,到达某一个节点则把目前总权值加上这个节点的权值,如果结果小于0则变成0.现在给你最多可以走的步数P和最大需要到达的权值大小G,问你需要的最小的初始权值为多少,能在P步内能够产生的最大权值大于等于G 题解:很容易想到初始权值越大,经过同样步数能够得到的权值就越大,当然是非严格递增的.那么直接想办法二分寻找初始权值就可以.但是如果步数太大了就没法模拟了,所以要消除步数的影响.步数的影响主要来源于在走环的过程中可能由

【模板整合】整体二分模板

模板题目:ZJOI2013 K大数查询原题是带插入区间第K大 注释足够看→_← #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define MAXN 50010 #define MAXINT 0x7fffffff #define lchild rt<<1,l,mid #define rchild rt

各种类型的二分模板

1.查找最后一个小于或者等于key的下标,若不存在,则返回-1 ==> 同lower_bound(arr+1, arr+1+n, key) int BinSearch(int a[], int n, int key) { int m, l = 0, r = n - 1;//闭区间[0, n - 1] while (l <= r) { m = (l+r)/2; if (a[m] <= key) l = m + 1; else if(a[m] > key) r = m - 1; } i

二分之万无一失的模板~~~

My first blog~~~. 这里给个二分的模板 1 //二分模板 2 l = 0;r += 10;//保证所有元素都有可以被遍历的机会 3 while(l + 1 < r) 4 { 5 int mid = l + r >> 1; 6 if(check(mid)) l = mid; 7 else r = mid; 8 } 原文地址:https://www.cnblogs.com/QuickSilverX/p/10352129.html

二分——二分查找算法模板

转自:二分查找算法模板 二分模板一共有两个,分别适用于不同情况.算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值. 版本1当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1. C++ 代码模板: int bsearch_1(int l, int r) { while (l < r) { int mid = l + r >> 1;