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

数的范围 - 题解

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int arr[N];
int n,q,tmp;
int bs_left(int arr[],int n,int x)
{
    int l=0,r=n+1;
    while(l+1<r)
    {
        int mid=(l+r)/2;
        if(arr[mid]>=x)//x——正无穷,只能从第一个等于x退出,从右向左往x挤
        {
            r=mid;//在最终检查时,如果 arr[mid] == x,说明 r 正好指向第一个出现 x 的位置
        }
        else
        {
            l=mid;
        }
    }
    if(arr[r]==x)
    {
        return r-1;
    }
    else
    {
        return -1;
    }
}
int bs_right(int arr[],int n,int x)
{
    int l=0,r=n+1;
    while(l+1<r)
    {
        int mid=(l+r)/2;
        if(arr[mid]<=x)//负无穷——x,只能从最后一个x退出,从左向右往x挤
        {
            l=mid;//在最终检查时,如果 arr[mid] == x,说明 l 正好指向最后一个出现 x 的位置
        }
        else
        {
            r=mid;
        }
    }
    if(arr[l]==x)
    {
        return l-1;
    }
    else
    {
        return -1;
    }
}
int main()
{
    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 转发 0 喜欢 5 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!