AcWing 789. 数的范围
原题链接
简单
作者:
月下邂逅
,
2024-04-18 19:25:14
,
所有人可见
,
阅读 1
C++ 代码
#include<iostream>
using namespace std;
const int N=1000010;
int arr[N];
int main()
{
int n,m,k;
scanf("%d",&n);
scanf("%d",&m);
for (int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
while(m--)
{
scanf("%d",&k);
int l=-1,r=n,mid;//因为判断条件是l+1!=r,但是l和r是可以取到n-1和0,所以赋值l=-1,r=n
//寻找第一个等于K的坐标 我这边让二分的边界定为 左边为<5 右边>=5 则所求为r
while(l+1!=r)//当l与r没有相接的时候,求边界,因为是需要<和>=的区间,所以不能判断l>r,这个条件求得的区间是重合的
{
mid=(l+r)>>1;
if(arr[mid]<k)
{
l=mid;
}
else
{
r=mid;
}
}
if(arr[r]!=k)
{
printf("-1 -1\n");
continue;
}
printf("%d ",r);
l=-1;
r=n;
//现在找最后一个<=5的数字 我这边让二分的左边为<=5 右边为>5
while(l+1!=r)
{
mid=(l+r)>>1;
if(arr[mid]<=k)
{
l=mid;
}
else
{
r=mid;
}
}
printf("%d \n",l);
}
return 0;
}