# [洛谷 P2249 【深基13.例1】查找](https://www.luogu.com.cn/problem/P2249)
## 看看~~臭老鼠~~我的评测记录吧
https://cdn.luogu.com.cn/upload/image_hosting/dnzricex.png
看在~~臭老鼠~~我这么辛苦写代码的份上,点个赞吧。
# 看题
https://cdn.luogu.com.cn/upload/image_hosting/prdp96h2.png
## 直接从头到尾搜索一遍查找数字是不可行的。
为什么?
就因为我试过,0蛋...
### 那么时间复杂度必为o(mn),
我想你应该不喜欢吧
那么这个时候,我们帅气的二分查找闪亮登场!!!(撒花)
### 我们先考虑从中间的数字开始查找:
# •那么如果中间的数字等于我们要找的数字,那么直接直接输出在返回便是
# •如果中间的数字小于我们要找的数字,那么再从中间数~n查找
# •如果中间数大于我们要找的数的话,同理,从1或0(看你自己)~ 中间数查找
二分过程中,如果 mid 位置的值大于等于 我们要找的数,就将 r 移动到
mid,否则就将 l 移动到 mid+1。(mid为中间值,l为左端点,r为右端点)
这样 r 永远是大于等于q的位置,而 l − 1 永远是小于 𝑟 的位置。
提示:二分中,在数组a[1]~a[n]中通常是有序的
最后奉上代码不堪入目
```
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[10000005];
int find(int x) {
int l = 1, r = n + 1;
while (l < r) {
long long mid = l + (r - l)/2;
if (a[mid] >= x)r = mid;
else l = mid + 1;
}
if(a[l] == x)return l;
else return -1;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
int o;
cin>>o;
int ans=find(o);
cout<<ans<<" ";
}
return 0;
}
```
点个赞就行。