1 条题解

  • 0
    @ 2025-10-8 16:51:34

    手工二分

    #include <bits/stdc++.h> 
    using namespace std;
    const int N=1e6+10;
    int a[N];
    int main()
    {
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        int q;scanf("%d",&q);
        while(q--)
        {
            int x;scanf("%d",&x);
            int l=1,r=n+1;
            while(l+1<r)
            {
                int mid=(l+r)/2;
                if(a[mid]<=x) l=mid;
                else          r=mid;
            }
            printf("%d\n",a[l]!=x ? -1 :l);
        }
        return 0;
    }
    

    STL二分(lower_bound upper_bound)

    #include <bits/stdc++.h> 
    using namespace std;
    const int N=1e6+10;
    int a[N];
    int main()
    {
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        a[n+1]=-2e9;
        int q;scanf("%d",&q);
        while(q--)
        {
            int x;scanf("%d",&x);
            int p=lower_bound(a+1,a+n+1,x)-a;
            if(a[p]==x)printf("%d\n",p);
            else printf("-1\n");
        }
        return 0;
    }
    

    lower_bound:在一个有序序列中进行二分查找,返回指向第一个 大于等于 x 的元素的位置的迭代器。如果不存在这样的元素,则返回尾迭代器。lower_bound(v.begin(),v.end(),x)。

    upper_bound:在一个有序序列中进行二分查找,返回指向第一个 大于 x 的元素的位置的迭代器。如果不存在这样的元素,则返回尾迭代器。upper_bound(v.begin(),v.end(),x)。

    • 1

    信息

    ID
    278
    时间
    300ms
    内存
    128MiB
    难度
    8
    标签
    递交数
    1015
    已通过
    135
    上传者