题目描述
直接判断是否满足,假设B为所求值,二分后所求满足答案的只有两种格式(针对二分以后的 l 和 l+1 而言) AB型和BB型,很明显第二个数值都为B,假设不为B,那么都是不满足的返回-1 -1即可
如果满足,再判断第一个数值是否为所求值,如果是那就是BB型,不需要自增,如果不是所求值,即AB型,将l自增1即可。
算法1
C++ 代码
#include <iostream>
using namespace std;
int main() {
int N,n,x;
scanf("%d%d",&N,&n);
int q[N+10];
for(int i=0; i<N; i++)scanf("%d",&q[i]);
while(n--) {
scanf("%d",&x);
int l=0,r=N-1;
while(l<r) {
int mid=l+r+1>>1;
if(q[mid]<x)l=mid;
else r=mid-1;
}
//判断是否为满足答案的值
if(q[l+1]!=x){
cout<<"-1 -1\n";
continue;
}
//进一步判断是AB型还是BB型
else if(q[l]!=x)++l,++r;
r=N-1;
int k=l;
while(l<r){
int mid=l+r>>1;
if(q[mid] > x)r=mid;
else l=mid+1;
}
if(q[l]!=x)--l,--r;
printf("%d %d\n",k,l);
}
}