返回题解分享
讨论 / 题解分享/ 帖子详情

数的范围 - 题解

万能二分板子,找左右边界即可
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 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!