Acwing 4653.数位排序(位运算)
强推,这篇博客写得也太好了!!!
https://www.acwing.com/solution/content/137064/
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=500200,M=2002;
LL f[N];
//用哈希表pre[i]记录值i最后一次出现时的位置下标
unordered_map<LL,LL> pre;
//unordered_map 容器底层采用的是哈希表存储结构
//该结构本身不具有对数据的排序功能
//所以此容器内部不会自行对存储的键值对进行排序
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
LL n,m,k;
cin>>n>>m>>k;
for(LL i=1;i<=n;i++)
{
LL x;
cin>>x;
pre[x]=i;//更新当前x的最新位置
f[i]=max(pre[x^k],f[i-1]);//如果这个数字b(也就是我们要的这个答案)所在位置更大的话就直接取这个
}
while(m--)
{
LL l,r;
cin>>l>>r;
//当查询区间[l, r], 右边界为r时, 至少包含一个数对时的左边界最大值,
//所以如果l小于这个左边界最大值, [l, r]内就至少有一个数对。
if(f[r]>=l) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
}
return 0;
}