二分查找

#include<iostream>
using namespace std;
const int N=100010;
int a[N];
int main(){
    int n,q,k;
    cin>>n>>q;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    while(q--){
        cin>>k;
        int l=0,r=n-1;//l和r是两个指针,一开始分别指向数组的头和尾
        while(l<r){
            int mid=(r+l)/2;
            if(a[mid]>=k) r=mid;//要找满足条件的最左边的值,r=mid,mid=(l+r)/2;
            else l=mid+1;
        }
        if(a[l]!=k) cout<<"-1 -1"<<" ";
        else{
            cout<<l<<" ";
            int l=0,r=n-1;
            while(l<r){
                int mid=(r+l+1)/2;//要找不满足条件的最右边的值,l=mid,mid=(l+r+1)/2;
                if(a[mid]<=k) l=mid;
                else r=mid-1;
            }
            cout<<l;
        }
        cout<<endl;
    }
    return 0;
}
上一篇:Aizu - 0121


下一篇:超级记忆/图像数字记忆 110位数字图像转换表 21-30