P8773 [蓝桥杯 2022 省 A] 选数异或 题解
P8773 [蓝桥杯 2022 省 A] 选数异或 题解
题目链接
简要思路
题目让我们查询是否有两个数
每一次遍历整个区间肯定是会超时的,所以我们考虑优化。
维护两个“数组”:
但是注意到:map
来维护。
对于
当当前输入的这个数 max
,得到较后的数即可。
考虑查询。
查询就很简单了,对于一个
完整代码
#include<bits/stdc++.h> #define int long long #define endl '\n' const int MAXN=1e5+5; int n,m,x,a; int f[MAXN];//f[i] 以 i 结尾上一个满足条件的值的位置 std::map<int,int> las;//las[i] 上一个值为 i 的位置 signed main(){ std::cin>>n>>m>>x; for(int i=1;i<=n;i++){ std::cin>>a; f[i]=std::max(f[i-1],las[a^x]);//维护 las[a]=i;//更新最后出现的位置 } while(m--){ int l,r; std::cin>>l>>r; if(f[r]>=l)std::cout<<"yes\n"; else std::cout<<"no\n";//查询 } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步