算法思路
两次二分算法分别找到上下界
重点根据check(mid)中更新r和l的情况选择上取整or下取整
#include <iostream>
using namespace std;
const int N = 100010;
int n,q[N],k,x;
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&q[i]);
while(k--)
{
scanf("%d",&x);
//先找到区间的下界
int l=0,r=n-1;
while(l<r)
{
int mid = l+r >> 1;
//说明[0-mid]数都比x小不是我们所要的
if(q[mid]>=x)
r = mid;//说明下界点在[l,mid]之间
else
l = mid+1;
}
//找到的q[l]与x不相符说明不在数组中
//此时找到的q[l]是第一个满足check里面的数,即第一个大于x的数
if(q[l] != x)
{
printf("-1 -1\n");
continue;
}
//找区间的上界
int l1=0,r1=n-1;
while(l1 < r1)
{
int mid = r1+l1+1 >> 1;
if(q[mid]<=x)
l1 = mid;//说明了上界点在[mid,r]之间
else
r1 = mid-1;
}
printf("%d %d\n", l, l1);
}
return 0;
}