当前位置: 首页 > news >正文

蓝桥杯 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,,N1,其中每个结点上都有一个整数 X i X_{i} Xi。他可以从树中任意选择两个不直接相连的结点 a 、 b a\text{、}b ab 并获得分数 X a ⊕ X b X_{a} \oplus X_{b} XaXb,其中 ⊕ \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 34=7

7. 评测用例规模与约定

对于 50 % {50}\% 50% 的评测用例, 1 ≤ N ≤ 1000 1 \leq N \leq {1000} 1N1000

对于所有评测用例, 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 1N105,0Xi2311,1FiN,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 XaXb 最大,这实际上是一个 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 n1 条边,总共产生的删除和插入操作为 4 × ( n − 1 ) 4 \times (n - 1) 4×(n1) 次。忽略常数,这部分复杂度视为 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()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux系统编程——生产者消费者模型
  • python基础---2.流程控制及函数
  • 2024Summer周报三
  • nodejs - express 学习笔记
  • 【Qt 】JSON 数据格式详解
  • 【传知代码】智慧医疗:纹理特征VS卷积特征(论文复现)
  • 计算机网络 6.1Internet概念
  • STM32 裸机 LWIP RAW接口 TCP客户端和服务端,以及UDP收发实现
  • Binius-based zkVM:为Polygon AggLayer开发、FPGA加速的zkVM
  • python机器学习8--网络
  • 【React】JSX 实现列表渲染
  • Linux进程控制——进程等待
  • WEB前端12-axios基础
  • SQL labs-SQL注入(四,sqlmap对于post传参方式的注入)
  • Java Web应用安全防护
  • php的引用
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 30秒的PHP代码片段(1)数组 - Array
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • AWS实战 - 利用IAM对S3做访问控制
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • ES学习笔记(12)--Symbol
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • FastReport在线报表设计器工作原理
  • JavaScript-Array类型
  • Javascript编码规范
  • JavaScript的使用你知道几种?(上)
  • js如何打印object对象
  • mysql常用命令汇总
  • MySQL数据库运维之数据恢复
  • node 版本过低
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • TypeScript实现数据结构(一)栈,队列,链表
  • windows-nginx-https-本地配置
  • 阿里云Kubernetes容器服务上体验Knative
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 搞机器学习要哪些技能
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 那些被忽略的 JavaScript 数组方法细节
  • 那些年我们用过的显示性能指标
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 详解NodeJs流之一
  • 用简单代码看卷积组块发展
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #565. 查找之大编号
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (30)数组元素和与数字和的绝对差
  • (4)(4.6) Triducer
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C语言)共用体union的用法举例
  • (webRTC、RecordRTC):navigator.mediaDevices undefined