去年就讲的题现在还没调对

,
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int n,m,X[N],Y[N],st[N][25];
map<int,int>mp;
int query(int l,int r)
{
	int k=log2(r-l+1);
	return max(st[l][k],st[r-(1<<k)+1][k]);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		cin>>X[i]>>st[i][0];
		mp[X[i]]=i;
	}
	for(int i=1;i<=n;++i)
	for(int j=1;j<=20;++j)
	{
		if(i+(1<<j)>n) continue;
		st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
	}
	cin>>m;
	while(m--)
	{
		int x,y;
		cin>>y>>x;
		if(!mp[x]&&!mp[y])
		{
			cout<<"maybe\n";
			continue;
		}
		int l=1,r=n,idx,idy;
		while(l<r)
		{
			int mid=(l+r)/2;
			if(X[mid]<=x) r=mid;
			else l=mid+1;
		}
		idx=r;
		l=1,r=n;
		while(l<r)
		{
			int mid=(l+r)/2;
			if(X[mid]>=y) r=mid;
			else l=mid+1;
		}
		idy=r;
		if(!mp[y])
		{
			if(query(idy,mp[x]-1)<st[mp[x]][0]) cout<<"maybe\n";
			else cout<<"false\n";
			continue;
		}
		if(!mp[x])
		{
			if(query(mp[y]+1,idx)<st[mp[y]][0]) cout<<"maybe\n";
			else cout<<"false\n";
			continue;
		}
		if(st[mp[x]][0]>st[mp[y]][0])
		{
			cout<<"false\n";
			continue;
		}
		if(query(mp[y]+1,mp[x]-1)>=st[mp[x]][0])
		{
			cout<<"false\n";
			continue;
		}
		bool flag=1;
		for(int i=y;i<=x;++i)
		{
			if(!mp[i])
			{
				flag=0;
				break;
			}
		}
		if(!flag)
		{
			cout<<"maybe\n";
			continue;
		}
		cout<<"true\n";
	}
	return 0;
}

采用暴力做法我看看

暴力法有的TLE50

不过题解说暴力能A

@金杭东1 e你给我看暴力吧,太菜了,正解不会

#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int n,m,X[N],Y[N];
unordered_map<int,int>mp;
int main()
{
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		cin>>X[i]>>Y[i];
		mp[X[i]]=Y[i];
	}
	cin>>m;
	while(m--)
	{
		int x,y;
		cin>>y>>x;
		if(!mp[x]&&!mp[y])
		{
			cout<<"maybe\n";
			continue;
		}
		if(!mp[y])
		{
			bool flag=1;
			for(int i=1;i<=n;++i)
			{
				if(X[i]<=y) continue;
				if(X[i]>=x) break;
				if(Y[i]>=mp[x])
				{
					flag=0;
					break;
				}
			}
			if(flag) cout<<"maybe\n";
			else cout<<"false\n";
			continue;
		}
		if(!mp[x])
		{
			bool flag=1;
			for(int i=1;i<=n;++i)
			{
				if(X[i]<=y) continue;
				if(X[i]>=x) break;
				if(Y[i]>=mp[y])
				{
					flag=0;
					break;
				}
			}
			if(flag) cout<<"maybe\n";
			else cout<<"false\n";
			continue;
		}
		if(mp[x]>mp[y])
		{
			cout<<"false\n";
			continue;
		}
		bool flag=1;
		for(int i=1;i<=n;++i)
		{
			if(X[i]<=y) continue;
			if(X[i]>=x) break;
			if(Y[i]>=mp[x])
			{
				flag=0;
				break;
			}
		}
		if(!flag)
		{
			cout<<"false\n";
			continue;
		}
		flag=1;
		for(int i=y;i<=x;++i)
		{
			if(!mp[i])
			{
				flag=0;
				break;
			}
		}
		if(!flag)
		{
			cout<<"maybe\n";
			continue;
		}
		cout<<"true\n";
	}
	return 0;
}

@金杭东1 我就是用暴力 A 的这道题

暴力要卡常,但是我不会卡

@金杭东1 啊,不用卡呀

可能我的暴力常数大吧

umap好像常数挺大的

@金杭东1 但是umap 常数肯定比 map 小

map不是常数大,是复杂度大

是不是要先二分,找到比y大的再枚举,我试试

变成T+W了

#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int n,m,X[N],Y[N];
unordered_map<int,int>mp;
int main()
{
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		cin>>X[i]>>Y[i];
		mp[X[i]]=Y[i];
	}
	cin>>m;
	while(m--)
	{
		int x,y;
		cin>>y>>x;
		int l=1,r=n,idx;
		while(l<r)
		{
			int mid=(l+r)/2;
			if(X[mid]>=y) r=mid;
			else l=mid+1;
		}
		idx=r+1;
		if(!mp.count(x)&&!mp.count(y))
		{
			cout<<"maybe\n";
			continue;
		}
		if(!mp.count(y))
		{
			bool flag=1;
			for(int i=idx;i<=n;++i)
			{
				if(X[i]>=x) break;
				if(Y[i]>=mp[x])
				{
					flag=0;
					break;
				}
			}
			if(flag) cout<<"maybe\n";
			else cout<<"false\n";
			continue;
		}
		if(!mp.count(x))
		{
			bool flag=1;
			for(int i=idx;i<=n;++i)
			{
				if(X[i]>=x) break;
				if(Y[i]>=mp[y])
				{
					flag=0;
					break;
				}
			}
			if(flag) cout<<"maybe\n";
			else cout<<"false\n";
			continue;
		}
		if(mp[x]>mp[y])
		{
			cout<<"false\n";
			continue;
		}
		bool flag=1;
		for(int i=idx;i<=n;++i)
		{
			if(X[i]>=x) break;
			if(Y[i]>=mp[x])
			{
				flag=0;
				break;
			}
		}
		if(!flag)
		{
			cout<<"false\n";
			continue;
		}
		flag=1;
		for(int i=y;i<=x;++i)
		{
			if(!mp.count(i))
			{
				flag=0;
				break;
			}
		}
		if(!flag)
		{
			cout<<"maybe\n";
			continue;
		}
		cout<<"true\n";
	}
	return 0;
}

这个代码加快读快写试试

循环展开试试

还要二进制优化
实在不行,开个O3优化:
#pragma G++ optimize(3,"Ofast","inline")

666,我还是想写正解

根据一篇警示后人的帖子,我跳到了10分

#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int n,m,X[N],Y[N],st[N][25];
map<int,int>mp;
int query(int l,int r)
{
	int k=log2(r-l+1);
	return max(st[l][k],st[r-(1<<k)+1][k]);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		cin>>X[i]>>st[i][0];
		mp[X[i]]=i;
	}
	for(int i=1;i<=n;++i)
	for(int j=1;j<=20;++j)
	{
		if(i+(1<<j)>n) continue;
		st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
	}
	cin>>m;
	while(m--)
	{
		int x,y;
		cin>>y>>x;
		if(!mp[x]&&!mp[y])
		{
			cout<<"maybe\n";
			continue;
		}
		int l=1,r=n,idx,idy;
		while(l<r)
		{
			int mid=(l+r+1)/2;
			if(X[mid]<=x) l=mid;
			else r=mid-1;
		}
		idx=l;
		l=1,r=n;
		while(l<r)
		{
			int mid=(l+r)/2;
			if(X[mid]>=y) r=mid;
			else l=mid+1;
		}
		idy=r;
		if(!mp[y])
		{
			if(mp[x]-1<idy||query(idy,mp[x]-1)<st[mp[x]][0]) cout<<"maybe\n";
			else cout<<"false\n";
			continue;
		}
		if(!mp[x])
		{
			if(idx<mp[y]+1||query(mp[y]+1,idx)<st[mp[y]][0]) cout<<"maybe\n";
			else cout<<"false\n";
			continue;
		}
		if(st[mp[x]][0]>st[mp[y]][0])
		{
			cout<<"false\n";
			continue;
		}
		if(mp[y]+1<=mp[x]-1&&query(mp[y]+1,mp[x]-1)>=st[mp[x]][0])
		{
			cout<<"false\n";
			continue;
		}
		bool flag=1;
		for(int i=y;i<=x;++i)
		{
			if(!mp[i])
			{
				flag=0;
				break;
			}
		}
		if(!flag)
		{
			cout<<"maybe\n";
			continue;
		}
		cout<<"true\n";
	}
	return 0;
}