选数异或 第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组

news/2025/3/28 22:34:33/

选数异或

题目来源

第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组

原题链接

第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组 选数异或 https://www.lanqiao.cn/problems/2081/learning/

题目描述

题目描述

给定一个长度为 n n n 的数列 A 1 , A 2 , ⋯ , A n A_{1}, A_{2}, \cdots, A_{n} A1,A2,,An 和一个非负整数 x x x, 给定 m m m 次查询, 每次询问能否从某个区间 [ l , r ] [l, r] [l,r] 中选择两个数使得他们的异或等于 x x x

输入格式

输入的第一行包含三个整数 n , m , x n, m, x n,m,x

第二行包含 n n n 个整数 A 1 , A 2 , ⋯ , A n A_{1}, A_{2}, \cdots, A_{n} A1,A2,,An

接下来 m m m 行,每行包含两个整数 l i , r i l_{i}, r_{i} li,ri 表示询问区间 [ l i , r i ] \left[l_{i}, r_{i}\right] [li,ri]

输出格式

对于每个询问, 如果该区间内存在两个数的异或为 x x x 则输出 yes, 否则输出 no

输入输出样例 #1

输入 #1

4 4 1
1 2 3 4
1 4
1 2
2 3
3 3

输出 #1

yes
no
yes
no

说明/提示

【样例说明】

显然整个数列中只有 2,3 的异或为 1 。

【评测用例规模与约定】

对于 20 % 20 \% 20% 的评测用例, 1 ≤ n , m ≤ 100 1 \leq n, m \leq 100 1n,m100;

对于 40 % 40 \% 40% 的评测用例, 1 ≤ n , m ≤ 1000 1 \leq n, m \leq 1000 1n,m1000;

对于所有评测用例, 1 ≤ n , m ≤ 1 0 5 , 0 ≤ x < 2 20 , 1 ≤ l i ≤ r i ≤ n 1 \leq n, m \leq 10^5,0 \leq x<2^{20}, 1 \leq l_{i} \leq r_{i} \leq n 1n,m105,0x<220,1lirin 0 ≤ A i < 2 20 0 \leq A_{i}<2^{20} 0Ai<220

蓝桥杯 2022 省赛 A 组 D 题。

算法思路

该问题要求我们多次查询一个区间 [l, r],判断是否存在两个不同的数 A[i]A[j],使得它们的异或等于给定的非负整数 x。为了高效处理多个查询,我们需要预处理一些信息,使得每次查询可以在常数时间内得到结果。

关键观察

  1. 异或的性质:如果 A[i] ^ A[j] = x,那么 A[j] = A[i] ^ x。因此,对于每个元素 A[i],我们只需要检查在它之前是否存在 A[i] ^ x
  2. 预处理:我们可以维护一个数组 f,其中 f[i] 表示在位置 i 之前(包括 i)满足 A[j] ^ A[k] = x 的最大 k(即最近的位置)。这样,对于查询 [l, r],只需要检查 f[r] 是否大于等于 l。如果是,则存在这样的两个数;否则不存在。

具体步骤

  1. 初始化:使用一个哈希表 h 来记录每个数值最后一次出现的位置。
  2. 预处理数组 f
    • 遍历数组 A,对于每个元素 A[i],计算 A[i] ^ x,并检查哈希表 h 中是否存在该值。
    • 如果存在,则 f[i]max(f[i-1], h[A[i] ^ x]),即当前位置 i 之前满足条件的最大位置。
    • 如果不存在,则 f[i] = f[i-1]
    • 更新哈希表 h,将 A[i] 的最新位置记录为 i
  3. 处理查询:对于每个查询 [l, r],检查 f[r] 是否大于等于 l。如果是,则输出 “yes”;否则输出 “no”。

代码

#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;const int N = 100010; // 定义最大数组长度
int n, m, x;         // n: 数组长度, m: 查询次数, x: 目标异或值
int f[N], e[N];      // f[i]: 预处理数组,e: 存储输入的数组
unordered_map<int, int> h; // 哈希表,记录数值最后一次出现的位置int main() {scanf("%d%d%d", &n, &m, &x); // 输入 n, m, xfor (int i = 1; i <= n; i++) {scanf("%d", &e[i]); // 输入数组元素// f[i] 表示在位置 i 之前(包括 i)满足 A[j] ^ A[k] = x 的最大 k// 即 f[i] = max(f[i-1], h[A[i] ^ x])f[i] = max(f[i - 1], h[e[i] ^ x]);// 更新哈希表,记录当前数值 e[i] 的最新位置为 ih[e[i]] = i;}for (int i = 0; i < m; i++) {int l, r;scanf("%d%d", &l, &r); // 输入查询区间 [l, r]// 如果 f[r] >= l,说明在 [1, r] 中存在一个位置 k >= l 满足 A[k] ^ A[j] = xif (f[r] >= l) puts("yes");else puts("no");}return 0;
}

代码解释

  1. 输入处理:读取数组长度 n、查询次数 m 和目标异或值 x,然后读取数组 e
  2. 预处理数组 f
    • f[i] 表示在位置 i 之前(包括 i)满足 A[j] ^ A[k] = x 的最大 k
    • 通过哈希表 h 快速查找 A[i] ^ x 是否出现过,并记录其最新位置。
  3. 查询处理:对于每个查询 [l, r],检查 f[r] 是否大于等于 l。如果是,则说明在区间 [l, r] 中存在两个数的异或等于 x

这种方法通过预处理将每次查询的时间复杂度降为 O(1),整体时间复杂度为 O(n + m),非常高效。


http://www.ppmy.cn/news/1582906.html

相关文章

【AI News | 20250323】每日AI进展

AI Repos 1、Fin-R1 Fin-R1 是一款针对金融领域复杂推理的大型语言模型&#xff0c;由上海财经大学统计与数据科学学院张立文教授与其领衔的金融大语言模型课题组&#xff08;SUFE-AIFLM-Lab&#xff09;联合财跃星辰研发并开源发布。该模型以 Qwen2.5-7B-Instruct 为基座&…

Vue 3 项目实现国际化指南 i18n

引言 在开发现代 Web 应用时&#xff0c;国际化&#xff08;Internationalization&#xff0c;简称 i18n&#xff09;已经成为一个不可或缺的功能。无论是面向全球用户的商业网站&#xff0c;还是需要支持多语言的企业应用&#xff0c;良好的国际化支持都能显著提升用户体验。本…

C语言-装饰器模式详解与实践 - LED控制系统

文章目录 C语言装饰器模式详解与实践 - LED控制系统1. 什么是装饰器模式&#xff1f;2. 为什么需要装饰器模式&#xff1f;3. 实际应用场景4. 代码实现4.1 头文件 (led_decorator.h)4.2 实现文件 (led_decorator.c)4.3 使用示例 (main.c) 5. 代码分析5.1 关键设计点5.2 实现特点…

基于腾讯云HAI-CPU部署DeepSeek:搭建图书馆知识库,赋能智慧图书馆建设

一、智慧图书馆建设背景与需求 &#xff08;一&#xff09;智慧图书馆建设的时代背景 在信息技术日新月异的大背景下&#xff0c;数字化浪潮以汹涌之势席卷了各个领域&#xff0c;图书馆作为信息资源的重要集散地&#xff0c;也迎来了前所未有的变革。随着社会对知识和信息需…

Java算法OJ(13)双指针

目录 1.前言 2.正文 2.1快乐数 2.2盛最多水的容器 2.3有效的三角形的个数 2.4和为s的两个数 2.5三数之和 2.6四数之和 3.小结 1.前言 哈喽大家好吖&#xff0c;今天继续加练算法题目&#xff0c;一共六道双指针&#xff0c;希望能对大家有所帮助&#xff0c;废话不多…

Java高频面试之集合-15

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;解决哈希冲突有哪些方法&#xff1f; 1. 开放寻址法&#xff08;Open Addressing&#xff09; 核心思想&#xff1a;当哈…

MD2Card(markdown)

MD2Card 介绍&#xff1a; 1.小红书爆款神器&#xff0c;Markdown笔记秒转高颜值卡片 2.实时预览15种主题&#xff0c;自动拆长文&#xff0c;图片/SVG导出即用 3.零门槛不登录&#xff0c;免费无限生成&#xff0c;专治排版废和设计手残党 网站地址&#xff1a; https://md2…

MyBatis-Flex、MyBatis-Plus 与 Fluent-Mybatis 的比较分析

MyBatis-Flex、MyBatis-Plus 与 Fluent-Mybatis 的比较分析 在日常开发中&#xff0c;很多项目会选择 MyBatis 作为 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;而为了减少样板代码和提升开发效率&#xff0c;各种扩展库层出不穷。其中&#xff0c;MyBatis-Flex…