整数二分

    技术2026-03-20  19

    大雪菜的课(笔记)

    基础算法(一)

    2.二分

    (1).整数二分

    模板(整数二分算法模板 —— 模板题 AcWing 789. 数的范围):
    bool check(int mid) {/* ......*/} int bsearch1(int q[],int l,int r){ while(l<r){ int mid=l+r>>1; if(check(q[mid])) r=mid; else l=mid+1; } return l; } int bsearch2(int q[],int l,int r){ while(l<r){ int mid=l+r+1>>1; if(check(q[mid])) l=mid; else r=mid-1; } return l; }

    AcWing789. 数的范围

    给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。

    对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。

    如果数组中不存在该元素,则返回“-1 -1”。

    输入格式 第一行包含整数n和q,表示数组长度和询问个数。

    第二行包含n个整数(均在1~10000范围内),表示完整数组。

    接下来q行,每行包含一个整数k,表示一个询问元素。

    输出格式 共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。

    如果数组中不存在该元素,则返回“-1 -1”。

    数据范围 1≤n≤100000 1≤q≤10000 1≤k≤10000 输入样例: 6 3 1 2 2 3 3 4 3 4 5 输出样例: 3 4 5 5 -1 -1

    #include <iostream> using namespace std; int main() { int n,q,k; scanf("%d%d",&n,&q); int a[n]; for(int i=0;i<n;i++) scanf("%d",&a[i]); while(q--){ scanf("%d",&k); int l=0,r=n-1; while(l<r){ int mid=l+r>>1; if(a[mid]>=k) r=mid; else l=mid+1; } if(a[l]==k){ cout<<l; l=0,r=n-1; while(l<r){ int mid=l+r+1; if(a[mid]<=k) l=mid; else r=mid-1; } cout<<' '<<l<<endl; }else{ cout<<"-1 -1"<<endl; } } return 0; }
    Processed: 0.010, SQL: 10