2 条题解

  • 1
    @ 2023-12-12 17:02:45

    简单的线段树加分类讨论。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+5;
    int n,m,a[N],w[N],l[N],r[N];
    int get1(int x){
    	return lower_bound(a+1,a+n+1,x)-a;
    }
    int get2(int x){
    	return lower_bound(a+1,a+n+1,x)-a-1;
    }
    struct trnode{
    	int l,r,lc,rc,mx;
    }tr[2*N];
    int trlen;
    void pushup(int now,int lc,int rc){
    	tr[now].mx=max(tr[lc].mx,tr[rc].mx);
    }
    void build(int nl,int nr){
    	trlen++;int now=trlen;
    	tr[now]=trnode{nl,nr,-1,-1,0};
    	if(nl==nr)tr[now].mx=w[nl];
    	else{
    		int mid=(nl+nr)>>1;
    		tr[now].lc=trlen+1;build(nl,mid);
    		tr[now].rc=trlen+1;build(mid+1,nr);
    		pushup(now,tr[now].lc,tr[now].rc);
    	}
    }
    int query(int now,int nl,int nr,int l,int r){
    	if(l>r)return 0;
    	if(l<=nl&&nr<=r){
    		return tr[now].mx;
    	}
    	int mid=(nl+nr)>>1;
    	int lc=tr[now].lc,rc=tr[now].rc;
    	int res=0;
    	if(l<=mid)res=max(res,query(lc,nl,mid,l,r));
    	if(mid<r)res=max(res,query(rc,mid+1,nr,l,r));
    	return res;
    }
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++){
    		scanf("%d%d",&a[i],&w[i]);
    	}
    	scanf("%d",&m);
    	for(int i=1;i<=m;i++){
    		scanf("%d%d",&l[i],&r[i]);
    	}
    	build(1,n);
    	for(int i=1;i<=m;i++){
    		int L=get1(l[i]),R=get2(r[i]);
    		if(a[L]==l[i]){
    			int res=query(1,1,n,L+1,R);
    			if(a[R+1]==r[i]){
    				int bk=((R+1-L)==(r[i]-l[i]));
    				if(bk&&res<w[R+1]&&w[R+1]<=w[L]){
    					puts("true");
    				}
    				else if(!bk&&res<w[R+1]&&w[R+1]<=w[L]){
    					puts("maybe");
    				}
    				else puts("false");
    			}
    			else{
    				if(res>=w[L]){
    					puts("false");
    				}
    				else puts("maybe");
    			}
    		}
    		else{
    			int res=query(1,1,n,L,R);
    			if(a[R+1]==r[i]){
    				if(res<w[R+1]){
    					puts("maybe");
    				}
    				else puts("false");
    			}
    			else puts("maybe");
    		}
    	}
    	return 0;
    }
    
    • 0
      @ 2022-9-5 18:18:06
      #include<bits/stdc++.h>
      #define il inline
      #define lson l,m,rt<<1
      #define rson m+1,r,rt<<1|1
      #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
      #define Max(a,b) ((a)>(b)?(a):(b))
      using namespace std;
      const int N=200005;
      int n,m,num[N],ls[N],rs[N];
      int ye[N],co[N];
      bool f[N];
      struct node{
          int ans,f;
      };
      
      il int gi(){
          int a=0;char x=getchar();bool f=0;
          while((x<'0'||x>'9')&&x!='-')x=getchar();
          if(x=='-')x=getchar(),f=1;
          while(x>='0'&&x<='9')a=(a<<3)+(a<<1)+x-48,x=getchar();
          return f?-a:a;
      }
      
      il void pushup(int rt){
          if(rs[rt<<1]==ls[rt<<1|1]-1)f[rt]=f[rt<<1]&f[rt<<1|1];
          rs[rt]=rs[rt<<1|1];ls[rt]=ls[rt<<1];
          num[rt]=Max(num[rt<<1],num[rt<<1|1]);
      }
      
      il void build(int l,int r,int rt){
          if(l==r){rs[rt]=ls[rt]=ye[l],num[rt]=co[l],f[rt]=1;return;}
          int m=l+r>>1;
          build(lson),build(rson);
          pushup(rt);
      }
      
      il node query(int L,int R,int l,int r,int rt){
          if(L<=l&&R>=r){
              node tmp;
              tmp.ans=num[rt],tmp.f=f[rt];
              return tmp;
          }
          int m=l+r>>1;
          node tmp;
          tmp.ans=0,tmp.f=1;
          if(L<=m){
              node x=query(L,R,lson);
              tmp.ans=Max(tmp.ans,x.ans);
              tmp.f&=x.f;
          }
          if(R>m){
              node x=query(L,R,rson);
              tmp.ans=Max(tmp.ans,x.ans);
              tmp.f&=x.f;
          }
          return tmp;
      }
      
      int main(){
          n=gi();
          For(i,1,n)ye[i]=gi(),co[i]=gi();
          build(1,n,1);
          m=gi();
          int x,y;
          while(m--){
              x=gi(),y=gi();
              if(x>=y){printf("false\n");continue;}
              int st=lower_bound(ye+1,ye+n+1,x)-ye,ed=lower_bound(ye+1,ye+n+1,y)-ye;
              bool fl,fr;int op=0;
              fl=ye[st]==x,fr=ye[ed]==y;
              if(!fl)st--;
              if(st+1<=ed-1)op=query(st+1,ed-1,1,n,1).ans;
              if((op>=co[ed]&&fr)||(co[st]<co[ed]&&fl&&fr)||(op>=co[st]&&fl))printf("false\n");
              else if(ed-st!=ye[ed]-ye[st]||!fr||!fl)printf("maybe\n");
              else printf("true\n");
          }
          return 0;
      }
      
      • 1

      信息

      ID
      1067
      时间
      1000ms
      内存
      256MiB
      难度
      6
      标签
      (无)
      递交数
      32
      已通过
      12
      上传者