题目链接:【深基13.例1】查找 - 洛谷
// P2249 【深基13.例1】查找
// 20211107 周日 二分法查找练习
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
// 使用STL模板
// upper_bound( begin,end,num) 返回第一个大于搜索数的位置,
// 从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。
// 通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
// lower_bound( begin,end,num) 返回是第一个大于等于的数的位置,
// 从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。
// 通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
const int MAXN = 1e6 + 10; // 1乘以10的6次方+防止数组越界的10
// 快读
int read(){
int x = 0, f = 1;
char c = getchar();
while(c < '0' || c > '9'){
if(c == '-'){
f = -1;
}
c = getchar();
}
while(c >= '0' && c <= '9'){
x = x*10+c-'0';
c = getchar();
}
return x*f;
}
int a[MAXN];
int main(){
int n = read(), m = read(); // n个数,询问m次
for(int i = 1; i <= n; i++){ // 将读入的n个数放入a[n]中,下标从1存到n
a[i] = read();
}
while(m--){ // 进行m次二分法查找
int x = read();
int ans = lower_bound(a+1, a+n+1, x) - a; // 返回的是目标元素的地址要-a
if(x != a[ans]){
printf("-1 "); // 注意每输出一个结果末尾的空格
} else{
printf("%d ", ans); // 注意输出一个数末尾的空格
}
}
return 0;
}