蓝桥杯 2024 年第十五届省赛真题 —— 最大异或结点
目录
- 1. 最大异或结点
- 1. 问题描述
- 2. 输入格式
- 3. 输出格式
- 4. 样例输入
- 5. 样例输出
- 6. 样例说明
- 7. 评测用例规模与约定
- 2. 解题思路
- 1. 解题思路
- 2. AC_Code
1. 最大异或结点
1. 问题描述
小蓝有一棵树,树中包含 N N N 个结点,编号为 0 , 1 , 2 , ⋯ , N − 1 0,1,2,\cdots, N - 1 0,1,2,⋯,N−1,其中每个结点上都有一个整数 X i X_{i} Xi。他可以从树中任意选择两个不直接相连的结点 a 、 b a\text{、}b a、b 并获得分数 X a ⊕ X b X_{a} \oplus X_{b} Xa⊕Xb,其中 ⊕ \oplus ⊕ 表示按位异或操作。
请问小蓝可以获得的最大分数是多少?
2. 输入格式
输入的第一行包含一个整数 N N N,表示有 N N N 个结点。
第二行包含 N N N 个整数 X 1 , X 2 , ⋯ , X N X_{1},X_{2},\cdots ,X_{N} X1,X2,⋯,XN,相邻整数之间使用一个空格分隔。
第三行包含 N N N 个整数 F 1 , F 2 , ⋯ , F N F_{1},F_{2},\cdots,F_{N} F1,F2,⋯,FN,相邻整数之间使用一个空格分隔,其中第 i i i 个整数表示 i i i 的父结点编号, F i = − 1 F_{i} = - 1 Fi=−1 表示结点 i i i 没有父结点。
3. 输出格式
输出一行包含一个整数表示答案。
4. 样例输入
5
1 0 5 3 4
-1 0 1 0 1
5. 样例输出
7
6. 样例说明
选择编号为 3 3 3 和 4 4 4 的结点, x 3 = 3 , x 4 = 4 x_{3} = 3,x_{4} = 4 x3=3,x4=4,他们的值异或后的结果为 3 ⊕ 4 = 7 3 \oplus 4 = 7 3⊕4=7 。
7. 评测用例规模与约定
对于 50 % {50}\% 50% 的评测用例, 1 ≤ N ≤ 1000 1 \leq N \leq {1000} 1≤N≤1000;
对于所有评测用例, 1 ≤ N ≤ 1 0 5 , 0 ≤ X i ≤ 2 31 − 1 , − 1 ≤ F i ≤ N , F i ≠ 0 1 \leq N \leq 10^{5},0 \leq X_{i} \leq 2^{31} - 1, - 1 \leq F_{i} \leq N,F_{i} \neq 0 1≤N≤105,0≤Xi≤231−1,−1≤Fi≤N,Fi=0。
2. 解题思路
1. 解题思路
- 暴力做法
直接枚举所有可能选择的组合,即枚举选择的 a a a 和 b b b。同时需要判断 a a a 和 b b b 是否为相邻节点,可以使用哈希表进行判断。对于所有可能的合法组合,计算异或值并取最大的异或值作为答案。
枚举的复杂度为 O ( n 2 ) O(n^2) O(n2),判断相邻的复杂度为 O ( log n ) O(\log n) O(logn),整体复杂度为 O ( n 2 log n ) O(n^2 \log n) O(n2logn),无法通过本题。
- 满分做法
考虑优化。对于需要选择两个元素 a a a 和 b b b 的题目,常见的套路是枚举 a a a,并从剩余元素中选择最优元素作为 b b b。在本题中,当 a a a 确定时,我们需要从剩余元素中找到最优元素 b b b 使得 X a ⊕ X b X_a \oplus X_b Xa⊕Xb 最大,这实际上是一个 01 01 01 字典树的典型应用。如果你对 01 01 01 字典树还不太熟悉,可以通过 01字典树 学习。
问题在于,当我们枚举 a a a 时,字典树中不能包含 a a a 的相邻元素。如何去除相邻元素的干扰?
一个直观的想法是当我们枚举到 a a a 时,先将字典树中所有 a a a 的相邻元素删除,在进行查询后再将所有相邻元素插回字典树。
思考:这样操作的复杂度是否可行?
显然是可行的。因为本题给定的是一棵树,对于每条边而言,假设其两端的点为 x x x 和 y y y,当我们枚举 a = x a = x a=x 时, y y y 会产生一次删除和插入;枚举到 a = y a = y a=y 时, x x x 会产生一次删除和插入。由于一棵树只有 n − 1 n - 1 n−1 条边,总共产生的删除和插入操作为 4 × ( n − 1 ) 4 \times (n - 1) 4×(n−1) 次。忽略常数,这部分复杂度视为 O ( n ) O(n) O(n)。
考虑到字典树每次插入、删除、查询的复杂度均为 O ( log V ) O(\log V) O(logV),其中 V V V 表示值域的最大值,整体复杂度为 O ( n log V ) O(n \log V) O(nlogV),可以通过本题。
2. AC_Code
- C++
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define sz(s) ((int)s.size())class Node {
public:array<Node *, 2> children{};int cnt = 0;
};class Trie {static const int HIGH_BIT = 31;
public:Node *root = new Node();void insert(ll val) {Node *cur = root;for (int i = HIGH_BIT; i >= 0; i--) {int bit = (val >> i) & 1;if (cur->children[bit] == nullptr) {cur->children[bit] = new Node();}cur = cur->children[bit];cur->cnt++;}}void remove(ll val) {Node *cur = root;for (int i = HIGH_BIT; i >= 0; i--) {cur = cur->children[(val >> i) & 1];cur->cnt--;}}int max_xor(ll val) {Node *cur = root;int ans = 0;for (int i = HIGH_BIT; i >= 0; i--) {int bit = (val >> i) & 1;if (cur->children[bit ^ 1] && cur->children[bit ^ 1]->cnt) {ans |= 1 << i;bit ^= 1;}cur = cur->children[bit];}return ans;}int min_xor(ll val) {Node *cur = root;int ans = 0;for (int i = HIGH_BIT; i >= 0; i--) {int bit = (val >> i) & 1;if (cur->children[bit] && cur->children[bit]->cnt) {cur = cur->children[bit];} else {ans |= 1 << i;cur = cur->children[bit ^ 1];}}return ans;}
};
void solve() {int n;cin >> n;vector<int> a(n);Trie tr{};for (int i = 0; i < n; ++i) {cin >> a[i];tr.insert(a[i]);}vector<vector<int>> adj(n);for (int i = 0; i < n; ++i) {int f;cin >> f;if (f != -1) {adj[i].push_back(f);adj[f].push_back(i);}}int ans = 0;for (int i = 0; i < n; ++i) {for (auto v : adj[i]) {tr.remove(a[v]);}ans = max(ans, tr.max_xor(a[i]));for (auto v : adj[i]) {tr.insert(a[v]);}}cout << ans << '\n';
}
int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);cout << setiosflags(ios::fixed) << setprecision(10);int t = 1;while (t--) {solve();}return 0;
}
- Java
import java.util.*;class Node {Node[] children = new Node[2];int cnt = 0;
}class Trie {private static final int HIGH_BIT = 31;Node root = new Node();void insert(long val) {Node cur = root;for (int i = HIGH_BIT; i >= 0; i--) {int bit = (int) ((val >> i) & 1);if (cur.children[bit] == null) {cur.children[bit] = new Node();}cur = cur.children[bit];cur.cnt++;}}void remove(long val) {Node cur = root;for (int i = HIGH_BIT; i >= 0; i--) {cur = cur.children[(int) ((val >> i) & 1)];cur.cnt--;}}int maxXor(long val) {Node cur = root;int ans = 0;for (int i = HIGH_BIT; i >= 0; i--) {int bit = (int) ((val >> i) & 1);if (cur.children[bit ^ 1] != null && cur.children[bit ^ 1].cnt > 0) {ans |= 1 << i;bit ^= 1;}cur = cur.children[bit];}return ans;}int minXor(long val) {Node cur = root;int ans = 0;for (int i = HIGH_BIT; i >= 0; i--) {int bit = (int) ((val >> i) & 1);if (cur.children[bit] != null && cur.children[bit].cnt > 0) {cur = cur.children[bit];} else {ans |= 1 << i;cur = cur.children[bit ^ 1];}}return ans;}
}public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] a = new int[n];Trie tr = new Trie();for (int i = 0; i < n; ++i) {a[i] = sc.nextInt();tr.insert(a[i]);}List<List<Integer>> adj = new ArrayList<>();for (int i = 0; i < n; ++i) {adj.add(new ArrayList<>());}for (int i = 0; i < n; ++i) {int f = sc.nextInt();if (f != -1) {adj.get(i).add(f);adj.get(f).add(i);}}int ans = 0;for (int i = 0; i < n; ++i) {for (int v : adj.get(i)) {tr.remove(a[v]);}ans = Math.max(ans, tr.maxXor(a[i]));for (int v : adj.get(i)) {tr.insert(a[v]);}}System.out.println(ans);}
}
- Python
class Node:def __init__(self):self.children = [None, None]self.cnt = 0class Trie:HIGH_BIT = 31def __init__(self):self.root = Node()def insert(self, val):cur = self.rootfor i in range(self.HIGH_BIT, -1, -1):bit = (val >> i) & 1if cur.children[bit] is None:cur.children[bit] = Node()cur = cur.children[bit]cur.cnt += 1def remove(self, val):cur = self.rootfor i in range(self.HIGH_BIT, -1, -1):bit = (val >> i) & 1cur = cur.children[bit]cur.cnt -= 1def max_xor(self, val):cur = self.rootans = 0for i in range(self.HIGH_BIT, -1, -1):bit = (val >> i) & 1if cur.children[bit ^ 1] and cur.children[bit ^ 1].cnt > 0:ans |= 1 << ibit ^= 1cur = cur.children[bit]return ansdef min_xor(self, val):cur = self.rootans = 0for i in range(self.HIGH_BIT, -1, -1):bit = (val >> i) & 1if cur.children[bit] and cur.children[bit].cnt > 0:cur = cur.children[bit]else:ans |= 1 << icur = cur.children[bit ^ 1]return ansdef solve():import sysinput = sys.stdin.readdata = input().split()idx = 0n = int(data[idx])idx += 1a = []tr = Trie()for i in range(n):a.append(int(data[idx]))tr.insert(a[-1])idx += 1adj = [[] for _ in range(n)]for i in range(n):f = int(data[idx])idx += 1if f != -1:adj[i].append(f)adj[f].append(i)ans = 0for i in range(n):for v in adj[i]:tr.remove(a[v])ans = max(ans, tr.max_xor(a[i]))for v in adj[i]:tr.insert(a[v])print(ans)if __name__ == "__main__":solve()相关文章:
蓝桥杯 2024 年第十五届省赛真题 —— 最大异或结点
目录 1. 最大异或结点1. 问题描述2. 输入格式3. 输出格式4. 样例输入5. 样例输出6. 样例说明7. 评测用例规模与约定 2. 解题思路1. 解题思路2. AC_Code 1. 最大异或结点 1. 问题描述 小蓝有一棵树,树中包含 N N N 个结点,编号为 0 , 1 , 2 , ⋯ , N − 1 0,1,2,…...
AV1技术学习:Loop Restoration Filter
环路恢复滤波器(restoration filter)适用于64 64、128 128 或 256 256 像素块单元,称为 loop restoration units (LRUs)。每个单元可以独立选择是否跳过滤波、使用维纳滤波器(Wiener filter)或使用自导滤波器&#…...
如何使用python实现自动化办公?干货满满!
Python作为一种简单而强大的编程语言,不仅在数据科学和软件开发领域广受欢迎,还在办公自动化方面发挥了巨大作用。通过Python,我们可以编写脚本来自动执行各种重复性任务,从而提高工作效率并减少错误。在本文中,我们将…...
QT Creator下载安装详细教程(保姆级教程)
qt下载安装 1.下载网址 通过清华大学开源软件镜像站进行下载:链接: https://mirrors.tuna.tsinghua.edu.cn/qt/development_releases/online_installers/ 这里我选的是4.4版本的,也可以选择4.7版本,问题不大。 根据电脑系统选择下载linux…...
无人机公司销售需要什么资质
国家民航局于2024年1月1日实施了《无人驾驶航空器飞行管理暂行条例》,根据这个管理条例里面的 第十一条 使用除微型以外的民用无人驾驶航空器从事飞行活动的单位应当具备下列条件,并向国务院民用航空主管部门或者地区民用航空管理机构申请取得民用无人驾…...
代码自动化重构工具OpenRewrite介绍
OpenRewrite 是一个用于大规模自动化代码重构的开源框架,它极大地提升了开发人员的研发效率,通过自动化地进行代码重构和转换,帮助开发人员消除代码库中的技术债务。 通过 LST、访问器和配方的结合,OpenRewrite 能够实现准确的代…...
Win11安装Docker
下载Docker Desktop for Windows 下载 下载连接:Install Docker Desktop on Windows | Docker Docs 地址在国外,需要科学上网。也可使用我提供的,百度网盘:https://pan.baidu.com/s/1232TTkkzLsoZyFjC3bmgiQ 安装 下载完成之后…...
Windows电脑如何启动RTSP服务实现本地摄像头数据共享
技术背景 提起Windows共享本地摄像头,好多人想到的是通过ffmepg或vlc串流到服务器,实际上,用轻量级RTSP服务更简单,本文就介绍下,如何用大牛直播SDK的Windows轻量级RTSP服务,采集摄像头,生成本…...
探索 Spring WebFlux:构建响应式 Web 应用
探索 Spring WebFlux:构建响应式 Web 应用 随着互联网的发展,传统的同步编程模型已经难以应对高并发和高吞吐量的需求。为了解决这些问题,响应式编程逐渐成为主流。Spring WebFlux 是 Spring 5 引入的一个响应式 Web 框架,它基于…...
C# 植物大战僵尸
Winform 版本开发 高效率、流畅植物大战僵尸 git地址:冯腾飞/植物大战僵尸...
css 作业 2
文章目录 前言第四题第五题第六题第七题第八题第九题第十题(子标签) 前言 昨天写了前面三次作业,今天把剩下的七个作业写完 第四题 http://127.0.0.1:5500/index1.html,就用这个网址查看代码在网页的展示效果 代码评测过不了&…...
axios在vue中的使用
文章目录 一、axios是什么?二、使用步骤2.1 下载2.2 引入2.3 使用Get请求Post请求Forms 三、封装 一、axios是什么? Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和no…...
FastAPI(七十七)实战开发《在线课程学习系统》接口开发-- 课程编辑和查看评论
源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 课程编辑 先来看下课程编辑 1.判断是否登录 2.判断课程是否存在 3.是否有权限(只有自己可以修改自己的课程) 4.名称是否重复…...
【JavaEE初阶】线程的概念及创建
目录 📕 前言 📕 认识线程(Thread) 🚩 概念 😊线程是什么 🙂 为啥要有线程 😭 进程和线程的区别(面试题重点) 🤭 Java的线程和操作系统线程…...
0727,学什么学,周六就应该休息!!!!!
周六就应该休息,一天就忙了两小时也不是我的错喵 目录 UDP的小总结 01:使用select实现一个基于UDP的一对一即时聊天程序。 1.0 复读机服务器和树洞客户端 2.0 byby不了一点的敬业服务器!!! 今天到此为止&#x…...
【C#】获取DICOM图像像素的像素值
8位像素深度的像素值 public byte GetGreyValue(int x, int y) {x Math.Min(x, m_nWidth - 1);y Math.Min(y, m_nHeight - 1);unsafe{byte* greyValue (byte*)m_pDicomData.ToPointer() y * m_nWidth x;return *greyValue;} } 16位像素深度的像素值 public ushort GetG…...
k8s多集群管理工具kubecm
文章目录 一、概述二、安装1、官网链接2、各平台安装2.1、MacOS2.2、Linux2.3、Windows 三、实例1、验证2、配置kubecm自动补全(选做)2.1、Bash2.2、Zsh2.3、fish2.4、PowerShell 3、创建存放kubeconfig文件的目录4、添加到 $HOME/.kube/config4.1、kube…...
通过 WSL 2 在Windows 上挂载 Linux 磁盘
原文查看 曾为了传输或者共享不同系统的文件频繁地在 Windows 和 Linux 系统之间切换,效率过低,所以尝试通过 WSL 2 在Windows 上挂载 Linux 磁盘。 先决条件 需要在Windows 10 2004 及更高版本(Build 19041 及更高版本)或 Win…...
【C#】在一个给定的宽、高范围内,获取到该多边形内部的所有坐标集合?
问题点 使用C#语言在一个给定的宽、高范围内,获取到该多边形内部的所有坐标集合? 这个多边形可能存在交叉及互相重叠部分 图像的宽、高可以定义为:2000*2000 多边形坐标集合:Point[] polygon_points new Point[] { new Point…...
json的数据结构
JSON 的数据结构 JSON 由两种数据结构组成:对象(字典)和数组。 一、对象 对象(object)是由键值对组成的无序集合。 键是字符串,值可以是任何类型,包括对象和数组;对象由一对花括…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
