RMQ-st表求助
查看原帖
RMQ-st表求助
247220
StarryWander楼主2022/10/8 13:18

按照第二篇题解的思路用st求区间最大值为什么会WA,RE。。。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
ll lg[500005],st[500005][30],b[500005];
void make_log(int n){
	for(int i=1;i<=n;i++){
		lg[i]=lg[i-1]+((1<<lg[i-1])==i);
	}
}
ll query(ll x,ll y){
	int k=lg[y-x+1]-1;
	return max(st[x][k],st[y-(1<<k)+1][k]);
}
map<ll,ll>mp;
int main(){
	ll n=read();
	for(ll i=1;i<=n;i++){
		mp[read()]=i;
		st[i][0]=b[i]=read();
	} 
	for(ll j=1;j<=30;j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			st[i][j]=max(st[i][j-1],st[i+(1<<j-1)][j-1]);
		}
	}
	make_log(n);
	int q=read();
	for(ll i=1;i<=q;i++){
		ll y=read(),x=read();
		//cout<<b[mp[x]]<<" "<<b[mp[y]]<<" "<<query(mp[y]+1,mp[x]-1)<<endl;
		if(y>=x) printf("false\n"); 
		else if(
		(mp.count(x)&&query(mp[y]+1,mp[x]-1)>b[mp[x]])||
		(mp.count(y)&&query(mp[y]+1,mp[x]-1)>b[mp[y]])||
		(mp.count(x)&&mp.count(y)&&b[mp[y]]<=b[mp[x]])
		) printf("false\n");
		else if((mp[x]-mp[y]<x-y)||!mp.count(x)||!mp.count(y)) printf("maybe\n");
		else printf("true\n");
	}
	return 0;
}

2022/10/8 13:18
加载中...