思路
说实话好久没写二分了,一上来给我写二分给我干蒙了,其实也就是
+ 当mid=l+r>>1的时候,l=mid+1,r=mid
+ mid=l+r+1>>1的时侯,r=mid-1,l=mid
代码
#include <iostream>
using namespace std;
const int N = 100010;
int a[N];
int n,q;
int find1(int x)
{
int l=0,r=n-1;
while(l<r)
{
int mid=(l+r)>>1;
if(a[mid]<x)l=mid+1;
else r=mid;
}
return l;
}
int find2(int x)
{
int l=0,r=n-1;
while(l<r)
{
int mid=(l+r+1)>>1;
if(a[mid]>x)r=mid-1;
else l=mid;
}
return l;
}
int main()
{
cin>>n>>q;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
while(q--)
{
int x;
cin>>x;
if(a[find1(x)]==x)cout<<find1(x)<<' '<<find2(x)<<endl;
else cout<<"-1 -1"<<endl;
}
return 0;
}