AcWing 789. 【算法基础课】数的范围
原题链接
简单
作者:
长夜未央
,
2023-03-25 15:25:22
,
所有人可见
,
阅读 172
宣传一下算法基础课整理
整数二分模板题
有单调性一定可以二分,但二分不一定非得有单调性
二分可以解决:有调用的,有单调性的
二分的本质是边界:只要找到某种性质,使得整个区间一分为二,那么就可以用二分把边界点二分出来
性质一半满足一半不满足
写二分问题时先写一个check函数,想一下check函数是true或false时,如何更新
如果是l=mid,或r=mid-1,补上l+r+1>>1
如果是r=mid,或l=mid+1,就不补上+1
为啥要补上+1?
C++的整数中除法是下取整
当l和r之间只差1的时候,如果不补上加1的话:(l+r)/2=l
如果check成功返回true,每一次都这样回死循环所以补上+1
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int q[N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)cin>>q[i];
while(m--)
{
int x;
cin>>x;
int l=0,r=n-1;
while(l<r)
{
int mid=l+r>>1;
if(q[mid]>=x)r=mid;
else l=mid+1;
}
if(q[l]!=x)cout<< "-1 -1"<<endl;
else
{
cout<<l<< ' ';
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;
}
cout<<l<<endl;
}
}
return 0;
}