二分查找(Easy Ver.)
题目描述
给定nn个单调递增的正整数a1,a2,a3,...,ana1,a2,a3,...,an。
进行qq次询问,每次询问一个正整数xx。输出xx在该序列中的出现的位置序号(如不存在,输出-1
)。
输入格式
第一行两个整数nn和qq
第二行nn个整数分别表示a1,a2,a3,...,ana1,a2,a3,...,an
接下来的qq行,每行一个查询的整数xx
输出格式
qq行,每行对应一次询问的答案
样例数据
样例输入1
7 3
1 2 5 8 9 10 13
5
12
13
样例输出1
3
-1
7
数据范围
对于20%的数据,q=1q=1;
对于100%的数据,1≤n≤106,1≤q≤105,1≤ai≤109
题解
#include <bits/stdc++.h>
using namespace std;
long long n,p,a[10000000],x[100000],a2[10000000];
int main(){
cin>>n>>p;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=p;i++){
cin>>x[i];
}for(int i=1;i<=p;i++){
long long l=1,r=n;
int o=1;
while(l<=r){
int man=(l+r)/2;
if(a[man]==x[i]){
a2[i]=man;
o=0;
break;
}
if(a[man]<x[i]){
l=man+1;
}else{
r=man-1;
}
}
if(o){
a2[i]=-1;
}
}
for(int i=1;i<=p;i++){
cout<<a2[i]<<endl;
}
return 0;
}