原题链接:
题解:
套板子即可
代码:
使用lower_bound和upper_bound:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,q;
int a[N];
void check(int x){
int l = lower_bound(a,a+n,x)-a;
int r = upper_bound(a,a+n,x)-a;
if(l==n||l==r) cout<<-1<<" "<<-1<<endl;
else{
cout<<l<<" "<<r-1<<endl;
}
}
int main(){
cin>>n>>q;
for(int i=0;i<n;i++) cin>>a[i];
while(q--){
int k;
cin>>k;
check(k);
}
}
手搓二分:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];
int bsearch1(int l, int r, int x) {
while (l < r) {
int mid = (l + r) >> 1;
if (a[mid] >= x) r = mid;
else l = mid + 1;
}
return (a[l] == x) ? l : -1;
}
int bsearch2(int l, int r, int x) {
while (l < r) {
int mid = (l + r + 1) >> 1;
if (a[mid] <= x) l = mid;
else r = mid - 1;
}
return (a[l] == x) ? l : -1;
}
int main() {
int n, q;cin >> n >> q;
for (int i = 0;i < n;i++) cin >> a[i];
for (int i = 0;i < q;i++) {
int x;cin >> x;
cout << bsearch1(0, n - 1, x) << " " << bsearch2(0, n - 1, x) << endl;
}
}