算法
二分
分两次,一次找头一次找尾
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+1e4;
ll n,t,sr;
ll a[N];
signed main()
{
cin>>n>>t;
for(ll i=1;i<=n;i++)cin>>a[i];
for(ll i=1;i<=t;i++)
{
cin>>sr;
ll left=1,right=n;
while(left<right)
{
ll mid=(left+right)/2;
if(a[mid]<sr)left=mid+1;
else right=mid;
}//寻找第一个为sr的数的下标
if(a[left]!=sr)
{
cout<<"-1 -1\n";
continue;
}
ll left_=left,right_=n+1;//在第一个为sr与其后面的数进行查找最后一个为sr的数的下标
while(left_+1<right_)//由于left_一定为sr,所以需要加1
{
ll mid=(left_+right_)/2;
if(a[mid]<=sr) left_=mid;
else right_=mid;
}
cout<<left-1<<" "<<left_-1<<"\n";
}
return 0;
}
//由于left_一定为sr,所以需要加1??为什么需要加一呢
为什么第二个right = n + 1呀
right_要比right大捏,你如果right_=n,前面right就可以改成n
6
6
6