2 条题解

  • 0
    @ 2025-9-14 17:30:17

    水个c++ ac代码

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int n,q,a[100100];
    //l<r`最终l==r l即为最终答案 需要缩小范围l=mid+1 r=mid-1(不然会死循环)
    //l<r-1 最终l与r相邻 不需要缩小范围 但是最后要判断l和r是否符合
    void ch1(int l,int r,int x){
        int mid=(l+r)/2;
        while(l<r-1){
            mid=(l+r)/2;
            if(a[mid]>=x){
               r=mid;
            }
            else l=mid;
        }
        if(x==a[l])cout<<l<<endl;
        else if(x==a[r])cout<<r<<endl;
        else cout<<-1<<endl;
       
    }
    void ch2(int l,int r,int x){
        int mid=(l+r)/2;
        while(l<r-1){
            mid=(l+r)/2;
            if(a[mid]<=x){
                l=mid;
            }
            else r=mid;
        }
        if(a[r]==x)cout<<r<<endl;
        else if(a[l]==x)cout<<l<<endl;
        else cout<<-1<<endl;
    }
    void ch3(int l,int r,int x){
        int mid=(l+r)/2;
        while(l<r){
            mid=(l+r)/2;
            if(a[mid]>=x){
                r=mid;
            }
            else l=mid+1;
        }
        if(a[r]>=x)cout<<r<<endl;
        else cout<<-1<<endl;
    }
    void ch4(int l,int r,int x){
        int mid=(l+r)/2;
        while(l<r){
            mid=(l+r)/2;
            if(a[mid]>x){
                r=mid;
            }
            else l=mid+1;
        }
        if(a[l]>x)cout<<l<<endl;
        else cout<<-1<<endl;
    }
    signed main(){
        cin>>n>>q;
        for(int i=1;i<=n;i++){
        cin>>a[i];
    }
        for(int i=1;i<=q;i++){
            int op,l,r,x;
            cin>>op>>l>>r>>x;
            if(op==1){
                ch1(l,r,x);
            }
            if(op==2){
                ch2(l,r,x);
            }
            if(op==3){
                ch3(l,r,x);
            }
            if(op==4){
                ch4(l,r,x);
            }
        }
            return 0;
    }
    

    信息

    ID
    39
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    95
    已通过
    26
    上传者