#include<iostream>#defineN1000010usingnamespace std;int a[N], m, n, k;//二分查找intfind(int x){int l =1,r = n +1;while(l < r){int mid =(l + r)/2;if(a[mid]>= x)
r = mid;//小于中间的数,在左区间else
l = mid +1;//大于中间的数,在右区间}if(a[l]== x)return l;if(a[l]!= x)return-1;}intmain(){
cin >> n >> m;for(int i =1; i <= n; i++)
cin >> a[i];for(int i =0; i < m; i++){
cin >> k;
cout <<find(k)<<" ";}return0;}```
这个是我成功ac之后的答案;
经过分析知道从头到尾搜索一遍肯定不可取,会超时,由于数列是单调不减的,因此可以使用二分法,这里要找到第一次出现的编号,即最小编号,因此右区间要不断缩小。
2021.8.1 计算机201叶