50pts线段树求大佬调
查看原帖
50pts线段树求大佬调
593255
dist_22r楼主2024/7/17 11:01

WA#1、#3、#4、#5、#6

#include<bits/stdc++.h>
#define ll long long
#define INF 1e9+7
#define lt u*2,l,mid
#define rt u*2+1,mid+1,r
#define ls u*2
#define rs u*2+1
#define mid (l+r)/2
using namespace std;
const int N=5e4+15;
int n,m,y[N],a[N],t[4*N],L[4*N],R[4*N];
bool v[4*N];
void push_up(int u)
{
	if(R[ls]==L[rs]-1)
	{
		v[u]=v[ls]&v[rs];
	}
	L[u]=L[ls];
	R[u]=R[rs];
	t[u]=max(t[ls],t[rs]);
}
void build(int u,int l,int r)
{
	if(l==r)
	{
		L[u]=R[u]=y[l];
		t[u]=a[l];
		v[u]=1;
		return ;
	}
	build(lt);
	build(rt);
	push_up(u);
}
int query(int u,int l,int r,int a,int b)
{
	if(a<=l&&b>=r)
	{
		return t[u];
	}
	int maxn=0;
	if(a<=mid)
	{
		maxn=max(maxn,query(lt,a,b));
	}
	if(b>mid)
	{
		maxn=max(maxn,query(rt,a,b));
	}
	return maxn;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>y[i]>>a[i];
	}
	build(1,1,n);
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int l,r;
		cin>>l>>r;
		if(l>=r)
		{
			cout<<"false"<<endl;
			continue;
		}
		int b=lower_bound(y+1,y+n+1,l)-y;
		int e=lower_bound(y+1,y+n+1,r)-y;
		bool vl,vr;
		vl=y[b]==l;
		vr=y[e]==r;
		int k=0;
		if(b==e-1)
		{
			if(vl&&vr)
			{
				if(a[b]<a[e])
				{
					cout<<"false"<<endl;
				}
				else
				{
					cout<<"true"<<endl;
				}
			}
			else
			{
				cout<<"maybe"<<endl;
			}
			continue;
		}
		k=query(1,1,n,b+1,e-1);
		if((vl&&k>=a[b])||(vl&&vr&&a[b]<a[e])||(vr&&k>=a[e]))
		{
			cout<<"false"<<endl;
		}
		else if(!vl||!vr||e-b!=y[e]-y[b])
		{
			cout<<"maybe"<<endl;
		}
		else
		{
			cout<<"true"<<endl;
		}
	}
	return 0;
}
2024/7/17 11:01
加载中...