1.应该把二分放到函数里,但一开始我没放,导致l,r,mid使用混乱所以以后应该把功能独立的内容封装到函数里使用。
2.两个二分找边界的函数写重了。
3.target是数组元素的数值,但我把他当成数组索引用了。
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N];
/*
性质:<=target
满足性质的可行区间:左
*/
int bsearch_2(int l,int r,int target)
{
while(l<r)
{
int mid=(l+r+1)>>1;
if(a[mid]<=target)
l=mid;
else
r=mid-1;
}
return l;
}
/*
性质:>=target
满足性质的可行区间:右
*/
int bsearch_1(int l,int r,int target)
{
while(l<r)
{
int mid=(l+r)>>1;
if(a[mid]>=target)
r=mid;
else
l=mid+1;
}
return l;
}
int main()
{
// freopen("xxx.in","r",stdin);
// freopen("yyy.out","w",stdout);
int n,q,target;
cin >> n >> q;
int l=0,r=n-1;
for(int i=0;i<n;i++)
cin >> a[i];
while(q--)
{
cin >> target;
int bj1=bsearch_1(l,r,target);
int bj2=bsearch_2(l,r,target);
if(a[bj1]==target && a[bj2]==target)
cout << bj1 << " " << bj2 << '\n';
else
cout << "-1 -1" << '\n';
}
// fclose(stdin);
// fclose(stdout);
return 0;
}