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;
}
posted @ 2022-10-13 09:30  高尔赛凡尔娟  阅读(24)  评论(0编辑  收藏  举报