二分答案复习

时间:2024-04-25 07:46:21

y总二分查找算法模板

在这里插入图片描述

int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;
        //性质在右边,区间划分成[l, mid]和[mid + 1, r]
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    return l;
}

int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
    	//性质在左边,区间划分成[l, mid - 1]和[mid, r]
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

数的范围

在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N];

int main(void){
    int n,q;cin>>n>>q;
    for(int i=1;i<=n;i++)cin>>a[i];
    while(q--){
        int x;cin>>x;
        //注:l是左边界下标,r是右边界下标
        int l=1,r=n;
        while(l<r){
            int mid=l+r>>1;
            //
            if(a[mid]>=x)r=mid;
            else l=mid+1;
        }
        if(a[l]!=x){
            cout<<"-1 -1"<<endl;
        }else{ 
            cout<<r-1<<" ";
            l=1,r=n;
            while(l<r){
                int mid=l+r+1>>1;
                if(a[mid]<=x)l=mid;
                else r=mid-1;
            }
            cout<<l-1<<endl;
        }
    }
    return 0;
}