当前位置: 首页 > 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()

相关文章:

蓝桥杯 2024 年第十五届省赛真题 —— 最大异或结点

目录 1. 最大异或结点1. 问题描述2. 输入格式3. 输出格式4. 样例输入5. 样例输出6. 样例说明7. 评测用例规模与约定 2. 解题思路1. 解题思路2. AC_Code 1. 最大异或结点 1. 问题描述 小蓝有一棵树,树中包含 N N N 个结点&#xff0c;编号为 0 , 1 , 2 , ⋯ , N − 1 0,1,2,…...

AV1技术学习:Loop Restoration Filter

环路恢复滤波器&#xff08;restoration filter&#xff09;适用于64 64、128 128 或 256 256 像素块单元&#xff0c;称为 loop restoration units (LRUs)。每个单元可以独立选择是否跳过滤波、使用维纳滤波器&#xff08;Wiener filter&#xff09;或使用自导滤波器&#…...

如何使用python实现自动化办公?干货满满!

Python作为一种简单而强大的编程语言&#xff0c;不仅在数据科学和软件开发领域广受欢迎&#xff0c;还在办公自动化方面发挥了巨大作用。通过Python&#xff0c;我们可以编写脚本来自动执行各种重复性任务&#xff0c;从而提高工作效率并减少错误。在本文中&#xff0c;我们将…...

QT Creator下载安装详细教程(保姆级教程)

qt下载安装 1.下载网址 通过清华大学开源软件镜像站进行下载&#xff1a;链接: https://mirrors.tuna.tsinghua.edu.cn/qt/development_releases/online_installers/ 这里我选的是4.4版本的&#xff0c;也可以选择4.7版本&#xff0c;问题不大。 根据电脑系统选择下载linux…...

无人机公司销售需要什么资质

国家民航局于2024年1月1日实施了《无人驾驶航空器飞行管理暂行条例》&#xff0c;根据这个管理条例里面的 第十一条 使用除微型以外的民用无人驾驶航空器从事飞行活动的单位应当具备下列条件&#xff0c;并向国务院民用航空主管部门或者地区民用航空管理机构申请取得民用无人驾…...

代码自动化重构工具OpenRewrite介绍

OpenRewrite 是一个用于大规模自动化代码重构的开源框架&#xff0c;它极大地提升了开发人员的研发效率&#xff0c;通过自动化地进行代码重构和转换&#xff0c;帮助开发人员消除代码库中的技术债务。 通过 LST、访问器和配方的结合&#xff0c;OpenRewrite 能够实现准确的代…...

Win11安装Docker

下载Docker Desktop for Windows 下载 下载连接&#xff1a;Install Docker Desktop on Windows | Docker Docs 地址在国外&#xff0c;需要科学上网。也可使用我提供的&#xff0c;百度网盘&#xff1a;https://pan.baidu.com/s/1232TTkkzLsoZyFjC3bmgiQ 安装 下载完成之后…...

Windows电脑如何启动RTSP服务实现本地摄像头数据共享

技术背景 提起Windows共享本地摄像头&#xff0c;好多人想到的是通过ffmepg或vlc串流到服务器&#xff0c;实际上&#xff0c;用轻量级RTSP服务更简单&#xff0c;本文就介绍下&#xff0c;如何用大牛直播SDK的Windows轻量级RTSP服务&#xff0c;采集摄像头&#xff0c;生成本…...

探索 Spring WebFlux:构建响应式 Web 应用

探索 Spring WebFlux&#xff1a;构建响应式 Web 应用 随着互联网的发展&#xff0c;传统的同步编程模型已经难以应对高并发和高吞吐量的需求。为了解决这些问题&#xff0c;响应式编程逐渐成为主流。Spring WebFlux 是 Spring 5 引入的一个响应式 Web 框架&#xff0c;它基于…...

C# 植物大战僵尸

Winform 版本开发 高效率、流畅植物大战僵尸 git地址&#xff1a;冯腾飞/植物大战僵尸...

css 作业 2

文章目录 前言第四题第五题第六题第七题第八题第九题第十题&#xff08;子标签&#xff09; 前言 昨天写了前面三次作业&#xff0c;今天把剩下的七个作业写完 第四题 http://127.0.0.1:5500/index1.html&#xff0c;就用这个网址查看代码在网页的展示效果 代码评测过不了&…...

axios在vue中的使用

文章目录 一、axios是什么&#xff1f;二、使用步骤2.1 下载2.2 引入2.3 使用Get请求Post请求Forms 三、封装 一、axios是什么&#xff1f; Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和no…...

FastAPI(七十七)实战开发《在线课程学习系统》接口开发-- 课程编辑和查看评论

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 课程编辑 先来看下课程编辑 1.判断是否登录 2.判断课程是否存在 3.是否有权限&#xff08;只有自己可以修改自己的课程&#xff09; 4.名称是否重复…...

【JavaEE初阶】线程的概念及创建

目录 &#x1f4d5; 前言 &#x1f4d5; 认识线程&#xff08;Thread&#xff09; &#x1f6a9; 概念 &#x1f60a;线程是什么 &#x1f642; 为啥要有线程 &#x1f62d; 进程和线程的区别&#xff08;面试题重点&#xff09; &#x1f92d; Java的线程和操作系统线程…...

0727,学什么学,周六就应该休息!!!!!

周六就应该休息&#xff0c;一天就忙了两小时也不是我的错喵 目录 UDP的小总结 01&#xff1a;使用select实现一个基于UDP的一对一即时聊天程序。 1.0 复读机服务器和树洞客户端 2.0 byby不了一点的敬业服务器&#xff01;&#xff01;&#xff01; 今天到此为止&#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自动补全&#xff08;选做&#xff09;2.1、Bash2.2、Zsh2.3、fish2.4、PowerShell 3、创建存放kubeconfig文件的目录4、添加到 $HOME/.kube/config4.1、kube…...

通过 WSL 2 在Windows 上挂载 Linux 磁盘

原文查看 曾为了传输或者共享不同系统的文件频繁地在 Windows 和 Linux 系统之间切换&#xff0c;效率过低&#xff0c;所以尝试通过 WSL 2 在Windows 上挂载 Linux 磁盘。 先决条件 需要在Windows 10 2004 及更高版本&#xff08;Build 19041 及更高版本&#xff09;或 Win…...

【C#】在一个给定的宽、高范围内,获取到该多边形内部的所有坐标集合?

问题点 使用C#语言在一个给定的宽、高范围内&#xff0c;获取到该多边形内部的所有坐标集合&#xff1f; 这个多边形可能存在交叉及互相重叠部分 图像的宽、高可以定义为&#xff1a;2000*2000 多边形坐标集合&#xff1a;Point[] polygon_points new Point[] { new Point…...

json的数据结构

JSON 的数据结构 JSON 由两种数据结构组成&#xff1a;对象&#xff08;字典&#xff09;和数组。 一、对象 对象&#xff08;object&#xff09;是由键值对组成的无序集合。 键是字符串&#xff0c;值可以是任何类型&#xff0c;包括对象和数组&#xff1b;对象由一对花括…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...