1 条题解

  • 0
    @ 2025-9-10 0:08:18

    C++ :

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int d[500010][25],n,m,a[500010],b[500010],x,y,xr,yr,ans;
    void ST(){
        for(int i=1;i<=n;i++) d[i][0]=b[i];
        for(int j=1;(1<<j)<=n;j++)
            for(int i=1;i+(1<<j)-1<=n;i++)
                d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
    }
    int ask(int x,int y){
        if(x>y) return 0;
        int k=0;
        while((1<<(k+1))<=y-x+1) k++;
        return max(d[x][k],d[y-(1<<k)+1][k]);
    }
    int get_lower(int x){
        int l=0,r=n,mid;
        while(l<r){
            mid=(l+r+1)>>1;
            if(x==a[mid]) return mid;
            if(x>a[mid]) l=mid; else r=mid-1;
        } return l;
    }
    void read(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d%d",&a[i],&b[i]);
        a[0]=a[n+1]=-0x3fffffff;
        ST();
        scanf("%d",&m);
    }
    int main(){
        read();
        for(int i=1;i<=m;i++){
            scanf("%d%d",&x,&y);
            if(x>y) swap(x,y);
            xr=get_lower(x); yr=get_lower(y);
            if(a[xr]!=x&&a[yr]!=y) ans=2;
            else if(a[xr]!=x){
                if(ask(xr+1,yr-1)<b[yr]) ans=2;
                else ans=0;
            }
            else if(a[yr]!=y){
                if(ask(xr+1,yr)<b[xr]) ans=2;
                else ans=0;
            }
            else{
                if(b[xr]>=b[yr]&&ask(xr+1,yr-1)<b[xr]&&ask(xr+1,yr-1)<b[yr]){
                    if(yr-xr==y-x) ans=1;
                    else ans=2;
                }
                else ans=0;
            }
            if(ans==0) puts("false");
            else if(ans==1) puts("true");
            else puts("maybe");
        }
        return 0;
    }
    
    
    • 1

    信息

    ID
    2704
    时间
    4000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者