万能二分板子,找左右边界即可
PS:记得注意下标嗷
PS:记得注意下标嗷
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
#define INF 0x3f3f3f3f3f
const int N = 100010;
using namespace std;
int arr[N];
int n,q,tmp;
int bs_left(int arr[],int n,int x){
int l = 0;
int r = n+1;
while(l+1<r){
int mid = (l+r)/2;
if(arr[mid]<x){
l = mid;
}else{
r = mid;
}
}
if(arr[r] == x){
return r-1;
}else{
return -1;
}
}
int bs_right(int arr[],int n,int x){
int l = 0;
int r = n+1;
while(l+1<r){
int mid = (l+r)/2;
if(arr[mid]<=x){
l = mid;
}else{
r = mid;
}
}
if(arr[l] == x){
return l-1;
}else{
return -1;
}
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i = 1; i<= n;i++){
cin>>arr[i];
}
while(q--){
cin>>tmp;
int ans_left = bs_left(arr,n,tmp);
int ans_right = bs_right(arr,n,tmp);
cout<<ans_left<<" "<<ans_right<<endl;
}
return 0;
}
0 回复
0 转发
2 喜欢
5 阅读



