解题思路:利用哈希表存储数据的位置,然后利用二分法减少时间复杂度,空间换时间。
注意事项:注意数据的存储结构
参考代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt(); // 数组长度
int m = scan.nextInt(); // 查询次数
int x = scan.nextInt(); // 目标异或值
int[] arr = new int[n + 1]; // 数组,从1开始存储
Map<Integer, List<Integer>> map = new HashMap<>();
// 输入数组,并记录每个值的索引
for (int i = 1; i <= n; i++) {
arr[i] = scan.nextInt();
if (!map.containsKey(arr[i])) {
map.put(arr[i], new ArrayList<>());
}
map.get(arr[i]).add(i);
}
// 处理每个查询
while (m-- > 0) {
int l = scan.nextInt(); // 查询区间左端点
int r = scan.nextInt(); // 查询区间右端点
boolean flag = false;
for (int i = l; i <= r; i++) {
int target = arr[i] ^ x;
if (map.containsKey(target)) {
List<Integer> list = map.get(target);
// 使用二分查找检查是否存在索引在 [l, r] 内
int low = 0, high = list.size() - 1;
while (low <= high) {
int mid = (low + high) / 2;
int idx = list.get(mid);
if (idx >= l && idx <= r && idx != i) { // 确保不是同一个元素
flag = true;
break;
} else if (idx < l) {
low = mid + 1;
} else {
high = mid - 1;
}
}
if (flag) {
break;
}
}
}
System.out.println(flag ? "yes" : "no");
}
scan.close();
}
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复