一、题目简述
二、一些思考与思路&代码
所谓“符合要求的位置”
代码实现:
#include<iostream>
using namespace std;
const int N=1e5+10;
int arr[N];
int n;int q;int k;
void binary_search(int l,int r,int k)
{//args:k是待查询的数字
int mid;int lres,rres;//分别是左边界和右边界
int ll =l,rr=r;
while(l<r)//先搜左边界(注意:不能l<=r否则当一直走的是第一个if的时候,会死循环)
{
mid=l+r>>1;//不+1取中点(向下取整),防止r恒等于mid死循环
if(arr[mid]>=k)
r=mid;
else
l=mid+1; //细节:当出循环的时候,l才是指向
}lres=l;
if(arr[l]!=k)//没搜到
{
cout<<-1<<" "<<-1<<endl;return;
}l=ll;r=rr;
while(l<r)//再搜右边界(check函数应该是找小于等于k的值)
{
mid=l+r+1>>1;
if(arr[mid]<=k)
l=mid;
else
r=mid-1;
}rres=l;
cout<<lres<<" "<<rres<<endl;
return;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
while(q--)
{
scanf("%d",&k);
binary_search(0,n-1,k);
}
return 0;
}
一个细节:最后l==r的,所以res=r也可。