#3第2850行把 maybe 判成 true
查看原帖
#3第2850行把 maybe 判成 true
637073
wujingfey楼主2023/10/3 16:20
#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){
	int res=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		res=(res<<3)+(res<<1)+c-'0';
		c=getchar();
	}
	return res*f;
}
const int N=5e4+5,INF=1e18+10;
int n,q,f1,f2,f3,mid_max,a[N],b[N];
struct NODE{
	int l,r,maxx;
}tr[N<<2];
void push_up(int p){
	tr[p].maxx=max(tr[p<<1].maxx,tr[p<<1|1].maxx);
	if(tr[p].r-tr[p].l != a[tr[p].r]-a[tr[p].l]) f2=1;//中间有不知道的 
}
void build(int p,int l,int r){
	tr[p].l=l; tr[p].r=r;
	if(l==r){
		tr[p].maxx=b[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	push_up(p);
}
int query(int p,int nl,int nr){
	if(nl<=tr[p].l&&tr[p].r<=nr){
		return tr[p].maxx;
	}
	int res=-INF;
	int mid=(tr[p].l+tr[p].r)>>1;
	if(nl<=mid) res=max(res,query(p<<1,nl,nr));
	if(mid<nr) res=max(res,query(p<<1|1,nl,nr));
	return res;
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		b[i]=read();
	} 
	build(1,1,n);
	q=read();
	for(int i=1;i<=q;i++){
		int y=read(),x=read();//y是起点,x是终点
		
		//保证y>=x && max(y-x)<x
		int st=lower_bound(a+1,a+1+n,y)-a;
		int ed=lower_bound(a+1,a+1+n,x)-a;
		f1=0,f2=0,f3=0,mid_max=0;
		
		if(a[st]!=y) f1=1;//左边查不到 
		if(a[ed]!=x) f3=1;//右边查不到 
		
		if(f1 && f3) mid_max = query(1,st,ed-1);//两边都查不到
		else if(f1 && !f3) mid_max = query(1,st,ed-1);//左边不查到,右边查得到
		else if(!f1 && f3) mid_max = query(1,st+1,ed-1);//左边查得到,右边查不到
		else mid_max = query(1,st+1,ed-1);//左右都查得到
		
		if(a[st]+1!=a[st+1] || a[ed-1]+1!=a[ed]) f2=1;//中间漏了 
		
		if(f1+f2+f3==3) printf("maybe\n");//左中右都不知道 
		else if(f1 && f3){//左右不清楚 
			printf("maybe\n");
		}else if(f1 && f2){//左中不清楚 
			if(mid_max>=b[ed]) printf("false\n");
			else printf("maybe\n");
		}else if(f2 && f3){//中右不清楚 
			if(b[st]<=mid_max) printf("false\n");
			else printf("maybe\n");
		}else if(f1==1){//左不清楚 
			if(mid_max>=b[ed]) printf("false\n");
			else printf("maybe\n");
		}else if(f2==1){//中不清楚 
			if(b[st]<b[ed] || mid_max>=b[ed] || b[st]<=mid_max) printf("false\n");
			else printf("maybe\n");
		}else if(f3==1){//右不清楚 
			if(b[st]<=mid_max) printf("false\n");
			else printf("maybe\n");
		}else{//全部清楚 
			if(b[st]>=b[ed] && mid_max<b[ed]) printf("true\n");
			else printf("false\n");
		}
	}
	return 0;
}

rt,快调死了,真不知道哪儿错了

2023/10/3 16:20
加载中...