数的范围
题目大意:给一个升序排列的数组,然后q次询问,问x这个数第一次和最后一次出现的位置。
解题思路:两种方法 标准二分 或者 lower_bound&&upper_bound 都可以。
二分:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n,q;
cin>>n>>q;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=1;i<=q;i++){
int x;
cin>>x;
int l=0,r=n-1,ans=-1;
while(l<=r){
int mid=l+r>>1;
if(a[mid]>=x){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
if(ans==-1||a[ans]!=x) cout<<"-1 -1"<<"\n";
else{
cout<<ans<<" ";
int l=0,r=n-1,ans=-1;
while(l<=r){
int mid=l+r>>1;
if(a[mid]<=x){
ans=mid;
l=mid+1;
}
else r=mid-1;
}
cout<<ans<<endl;
}
}
}
lower_bound&&upper_bound:
#include <bits/stdc++.h>
using namespace std;
inline void solve(int k, vector<int> &v) {
int l = lower_bound(v.begin(), v.end(), k) - v.begin();
int r = upper_bound(v.begin(), v.end(), k) - v.begin();
if(v[l] == k) printf("%d ", l);
else printf("-1 ");
if(v[r - 1] == k) printf("%d\n", r - 1);
else printf("-1\n");
}
int main(){
int n, q, k, tmp;
cin >> n >> q;
vector<int> v;
for(int i = 0; i < n; i ++) {
cin >> tmp; v.push_back(tmp);
}
while(q --) {
cin >> k;
solve(k, v);
}
return 0;
}