
样例输入:
4 4 1
1 2 3 4
1 4
1 2
2 3
3 3
样例输出:
yes
no
yes
no
分析:每次询问给定一个区间[l,r],问该区间内是否存在两个不同的下标使得这两个下标对应的数的异或值为x。其实我们只需要用一个f[i]存储以i作为区间右边界且满足题意的最大区间左边界即可。那么我们每次判断一个区间是否满足题意就只需要判断f[r]与l的关系即可,如果f[r]>=l那么这个区间就是满足题意的,否则就是不满足题意的。那么这个数组怎么来进行更新呢?首先假如当前遍历到第i个数,那么以i作为右区间找寻左区间有两种情况,第一种是第i个数不参异或运算,那么左区间应该就是第i-1个数作为右区间边界的对应最大左区间边界,还有一种情况就是第i个数参与异或运算,那么区间的左边界就应该是第i个数与x的异或值上一次出现的位置,这两种情况求出来的区间左边界都是可以的,取一个最大值即可。所以利用这点性质我们就可以完成f数组的动态转移,然后对于每组询问直接O(1)判断即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector&g
区间异或查询的高效解决方案,

文章介绍了一种处理区间异或查询的方法,通过构建f数组存储以每个位置为右边界的最大满足条件的左边界,以及last数组记录每个数上次出现的位置。在动态更新f数组的过程中,考虑当前数是否参与异或运算,从而找到可能的左边界,最后对每组询问进行O(1)的时间复杂度判断。
最低0.47元/天 解锁文章
701

被折叠的 条评论
为什么被折叠?



