题目
思路
板子题,这道题目是二分,二分有两种形式,分别是找到符合性质的两个边界,主要是要确定好边界条件防止出错,通用模板
bool check(int x) {/* ... */} // 检查x是否满足某种性质
// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l,int r)
{
while (l<r)
{
int mid=l+r>>1;
if (check(mid)) r=mid; // check()判断mid是否满足性质
else l=mid+1;
}
return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l,int r)
{
while(l<r)
{
int mid=l+r+1>>1;
if (check(mid)) l=mid;
else r=mid-1;
}
return l;
}
题解
#include <iostream>
using namespace std;
const int N=1e5+10;
int q[N];
int main()
{
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&q[i]);
}
while(k--)
{
int l,r,t;
scanf("%d",&t);
l=0,r=n-1;
while(l<r)
{
int mid=l+r>>1;
if(q[mid]>=t) r=mid;
else l=mid+1;
}
if(q[l]!=t) cout<<"-1 -1"<<endl;
else
{
cout<<l<<" ";
l=0,r=n-1;
while(l<r)
{
int mid=l+r+1>>1;
if(q[mid]<=t) l=mid;
else r=mid-1;
}
cout<<l<<endl;
}
}
return 0;
}