选数异或
问题描述
给定一个长度为 �n 的数列 �1,�2,⋯,��A1,A2,⋯,An 和一个非负整数 �x, 给定 �m 次查 询, 每次询问能否从某个区间 [�,�][l,r] 中选择两个数使得他们的异或等于 �x 。
输入格式
输入的第一行包含三个整数 �,�,�n,m,x 。
第二行包含 �n 个整数 �1,�2,⋯,��A1,A2,⋯,An 。
接下来 �m 行,每行包含两个整数 ��,��li,ri 表示询问区间 [��,��][li,ri] 。
输出格式
对于每个询问, 如果该区间内存在两个数的异或为 �x 则输出 yes, 否则输出 no。
#include<bits/stdc++.h> using namespace std; const int maxn = 100000 + 10; int tree[maxn << 2]; int Left[maxn], pos[(1 << 20) + 10]; int a[maxn], n, m, x; //线段树模板 void build(int o, int l, int r) { if(l == r) { tree[o] = Left[l]; return; } int mid = (l + r) >> 1; build(o << 1, l, mid); build(o << 1 | 1, mid + 1, r); tree[o] = max(tree[o << 1], tree[o << 1 | 1]); } //查询区间[L,R]的最大值 int query(int o, int l, int r, int L, int R) { if(L <= l && r <= R)return tree[o]; int mid = (l + r) >> 1; int ans = 0; if(L <= mid)ans = max(ans, query(o << 1, l, mid, L, R)); if(R > mid)ans = max(ans, query(o << 1 | 1, mid + 1, r, L, R)); return ans; } int main() { cin >> n >> m >> x; for(int i = 1; i <= n; i++) //预处理Left数组 { cin >> a[i]; Left[i] = pos[a[i] ^ x]; pos[a[i]] = i; } build(1, 1, n);//线段树建树 while(m--) { int l, r; cin >> l >> r; if(query(1, 1, n, l, r) >= l)//查询区间最值 cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探