数的范围
算法:二分
题目大意:
从这里可知,右半边的性质是的性质是>=x
然而左半边的的性质是<=x
#include <iostream>
using namespace std;
const int N=100010;
int n,m,q[N];
int main()
{
cin>>n>>m;
for(int i=0; i<n; i++) cin>>q[i];
//输入
while(m--)//一共有m个询问
{
int x;
cin>>x;//这里求的边界就是要查询的数
int l=0,r=n-1;//下标从0~n-1
//先二分左半边
while(l<r)
{
//mid可能是答案,所以要用模板2
int mid=(l+r)>>1;
//相当于/2,但是/2是向下取整,>>是四舍五入
if(q[mid]>=x) r=mid;
else l=mid+1;
}
if(q[l]!=x) cout<<"-1 -1"<<endl;
//当序列中不存在x时,返回的是最前面的那个>=x的数
//所以如果x不存在的话,返回的数就一定>=x
//所以就输出-1,-1
else
{
cout<<l<<" ";
//其实输出l和r都没所谓,因为跳出循环时l是等于r的
//再二分右半边
int l=0,r=n-1;
while(l<r)
{
//模板1
int mid=(l+r+1)>>1;
if(q[mid]<=x) l=mid;
else r=mid-1;
}
cout<<l<<endl;
}
}
return 0;
}