分析
问题相当于在给定区间 [l,r] 中 判定是否存在 i,j 使得 ai⊕aj=x
根据异或性质 也就等价于寻找 i,j 使得 ai=aj⊕x
DP
我们定义 至少存在一个数对 i,j 满足 ai=aj⊕x 的区间为 满足条件区间
定义 dpi 表示右端点为 i 的满足条件区间中 最大的左端点值 即所有满足条件区间 [j,i] 中 最大的 j
于是 对于给定查询 [l,r] 其是否有解取决于 dpr 的值
1) 若 dpr<l 表示所有满足条件区间的左端点均大于 l 即区间 [l,r] 不满足条件 返回 no
2) 若 dpr>=l 表示在区间 [dpr,r] 内存在满足条件数对 返回 yes
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops")
#define endl '\n'
#define ios cin.tie(0)->sync_with_stdio(0);cout.tie(0);
#define fin freopen("in","r",stdin);
#define All(v) v.begin(),v.end()
#define For(i,_,__) for(int i=_,i##end=__;i<i##end;++i) // For(i,j,k) for(int i=j;i<k;i++)
#define Rep(i,_,__) for(int i=(__)-1,i##end=_;i>=i##end;--i) // Rep(i,j,k) for(int i=k-1;i>=j;i--)
#define V vector
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int inf=0x3f3f3f3f,mod=1e9+7;
const ll infl=0x3f3f3f3f3f3f3f3fll;
const ll N=1e5+10;
ll n,m,x;
ll dp[N];
int main(){
ios;
cin>>n>>m>>x;
map<ll,ll>prev;
For(i,1,n+1){
ll t;
cin>>t;
dp[i]=max(dp[i-1],prev[t^x]);
prev[t]=i;
}
For(i,1,m+1){
ll l,r;
cin>>l>>r;
if(l<=dp[r]) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
因为个人没太理解最大下界
之类 所以写了这篇题解(如果有错还请提醒www)