题目描述
输入$n(n≤10^6)$个不超过$10^9$的单调不减的(就是后面的数字不小于前面的数字)非负整数$a_1,a_2,\ldots,a_n$,然后进行$m(m≤10^5)$次询问。对于每次询问,给出一个整数$target(target≤10^9)$,要求输出序列中第一个大于等于该数的位置。如果没有这样的位置,请输出-1
。
输入描述
第一行2个整数,表示数字个数n和询问次数m。
第二行n个整数,表示这些待查询的数字。
第三行m个整数,表示询问这些数字的编号,从1开始编号。
输出描述
m个整数表示答案。
输入样例
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 20
输出样例
1 2 -1
#include <bits/stdc++.h>
using namespace std;
//查找第一个 >= target的位置
//还未染色的区间是(L, R)
int binarySearch1(int* a, int n, int target) {
int L = -1, R = n;
while (L + 1 < R){
int mid = (L + R) / 2;
if (a[mid] >= target){
R = mid;
}else{
L = mid;
}
}
return R == n ? -1 : R;
}
int a[1000010];
int main() {
int n, m, target;
cin >> n >> m;
for (int i = 0; i < n; i++){
cin >> a[i];
}
for (int i = 0; i < m; i++) {
cin >> target;
int pos = binarySearch1(a, n, target);
if (pos == -1)
cout << -1;
else
cout << pos+1;
cout << " ";
}
return 0;
}