【蓝桥备赛】异或和——树状数组、DFS

题目链接

异或和

思路分析

树上每个点都有一个点权,对树上的更新操作是修改指定点的点权,查询操作是查询指定点为根结点的子树点权异或和。
这里的这些操作都和树状数组的单点修改和区间查询非常相似,即我们在修改一个点时,同时修改其往上所有祖先的子树点权异或和,这样在查询操作时可以直接打印出结果。
然而,我们一开始并不知道该结点的父节点到底到底是哪一个,所以我们可以通过一个dfs去预处理。

当然,此题也可以比较暴力的去处理,此处就不进行列举了。

参考代码

在这里插入图片描述

Java

import java.io.*;
import java.util.Vector;public class Main {static int n, m;static int[] arr, fa, dp;static Vector<Vector<Integer>> edge;static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));// 通过 dfs 先求出初始状态下以每个结点为根的子树点权异或和// 记录下他的父亲结点,方便后续更新该结点时,同时更新其父亲结点static void dfs(int x, int f) {fa[x] = f;dp[x] ^= arr[x];for(int to : edge.get(x)) {if(to == f) continue;dfs(to, x);dp[x] ^= dp[to];}}static void modify(int x, int y) {int t = arr[x]; // 记录下当前结点的初始值arr[x] = y; // 修改当前点权while(x != -1) {dp[x] = dp[x] ^ t ^ y;// 根据 a^a=0的特性,删除旧的点权x = fa[x];// 向上修改父亲结点}}static void search(int x) {out.println(dp[x]); // 直接打印即可}public static void main(String[] args) {Scanner sc = new Scanner();n = sc.nextInt();m = sc.nextInt();arr = new int[n + 1];fa = new int[n + 1];dp = new int[n + 1];for(int i = 1; i <= n; ++i) {arr[i] = sc.nextInt();}edge = new Vector<>();for(int i = 0; i <= n; ++i) {edge.add(new Vector<>());}for(int i = 1; i <= n - 1; ++i) {int u = sc.nextInt();int v = sc.nextInt();edge.get(u).add(v);edge.get(v).add(u);}dfs(1, -1);for(int i = 1; i <= m; ++i) {int op = sc.nextInt();if(op == 1) {int x = sc.nextInt();int y = sc.nextInt();modify(x, y);}if(op == 2) {int x = sc.nextInt();search(x);}}out.flush();}
}
class Scanner {static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));public int nextInt() {try {st.nextToken();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return (int)st.nval;}
}

C/C++

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;int n, m, arr[N], fa[N], dp[N];
vector<int> edge[N];
// 标记父节点并初始化
void dfs(int x, int f)
{fa[x] = f;dp[x] ^= arr[x];for(int to : edge[x]){if(to == f) continue;dfs(to, x);dp[x] ^= dp[to];}
}
// 修改当前点点权,并更新与其关联的父节点
void update(int x, int y)
{int t = arr[x];arr[x] = y;while(x != -1){dp[x] = dp[x] ^ t ^ y;x = fa[x];}
}
// 查询
void query(int x)
{cout << dp[x] << "\n";
}int main()
{ios::sync_with_stdio(0), cin.tie(0);cin >> n >> m;for (int i = 1; i <= n; ++i) cin >> arr[i]; // 记录点权for(int i = 1; i <= n - 1; ++i){int u, v;cin >> u >> v;edge[u].push_back(v);edge[v].push_back(u);}dfs(1, -1);while(m--){int op; cin >> op;if(op==1){int x, y; cin >> x >> y;update(x, y);}else{int x; cin >> x;query(x);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/792784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯真题:递增序列

import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main {public static int is1(char ch[][],int m,int n){int ans0;for (int i0;i<m;i){for (int j0;j<n;j){int add1;while(jadd<n){if(ch[i][j]<ch[i][jadd]) ans; //横…

SAP新的扩展策略

在软件即服务&#xff08;SaaS&#xff09;应用的推动下&#xff0c;SAP Cloud优先的战略非常明显&#xff0c;随之带来的是SAP Clean core的战略&#xff0c;从经典的 ABAP 可扩展性模式转变为 SAP S/4HANA 现代可扩展性模式。那么Clean core战略到底是什么&#xff1f;新的扩…

基于向量数据库搭建自己的搜索引擎

前言【基于chatbot】 厌倦了商业搜索引擎搜索引擎没完没了的广告&#xff0c;很多时候&#xff0c;只是需要精准高效地检索信息&#xff0c;而不是和商业广告“斗智斗勇”。以前主要是借助爬虫工具&#xff0c;而随着技术的进步&#xff0c;现在有了更多更方便的解决方案&…

LongAdder 和 Striped64 基础学习

cs&#xff0c;表示 Cell 数组的引用&#xff1b;b&#xff0c;表示获取的 base 值&#xff0c;类似于 AtomicLong 中全局变量的 value 值&#xff0c;在没有竞争的情况下数据直接累加到 base 上&#xff0c;或者扩容时&#xff0c;也需要将数据写入到 base 上&#xff1b;v&am…

Linux第2课Windows下的环境配置-虚拟机安装

文章目录 Linux第2课Windows下的环境配置-虚拟机安装一、VMware虚拟机的安装&#xff08;一&#xff09;安装VMware&#xff08;二&#xff09;启动电脑本地的VMware相关服务 二、VirtualBox安装 Linux第2课Windows下的环境配置-虚拟机安装 本节课程提供了两种虚拟机的安装方法…

个人医疗开支预测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 项目背景 随着医疗成本的持续上涨&#xff0c;个人医疗开支成为一个重要议题。理解影响医疗费用的多种因素对于医疗保险公司、政府机构以及个人…

磁环的使用方法

磁环的使用方法 磁环的工作原理共模滤波用法差模滤波用法各种材料磁环的对应频率磁环的感量计算 磁环的工作原理 共模滤波用法 差模滤波用法 各种材料磁环的对应频率 磁环的感量计算

Redis从入门到精通(四)Redis实战(二)商户查询缓存

↑↑↑请在文章头部下载测试项目原代码↑↑↑ 文章目录 前言4.2 商户查询缓存4.2.1 缓存介绍4.2.2 查询商户信息的传统做法4.2.2.1 接口文档4.2.2.2 代码实现4.2.2.3 功能测试 4.2.3 查询商户信息添加Redis缓存4.2.3.1 逻辑分析4.2.3.2 代码实现4.2.3.3 功能测试 4.2.3 数据一致…

【MATLAB源码-第177期】基于matlab的蜘蛛蜂优化算法(SWO)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蜘蛛蜂优化算法&#xff08;Spider Wasp Optimization, SWO&#xff09;是一种启发式算法&#xff0c;它受到自然界中蜘蛛和蜂这两种生物的行为模式启发而开发。这一算法主要模拟了蜘蛛捕食与蜂群社会行为之间的相互作用&…

网络以太网之(1)基础概念

网络以太网之(1)基础概念 Author: Once Day Date: 2024年4月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

C语言-----数据在内存中的存储(1)

1.整数在内存中的存储 我们之前就了解过整数的二进制写法分别有3种&#xff0c;分别为原码&#xff0c;反码&#xff0c;补码。整型在内存中存储的是补码。 原码&#xff0c;反码&#xff0c;补码都有自己的符号位和数值位&#xff0c;符号位为1时&#xff0c;则表示负数&…

【Docker笔记05】【网络模式】

一、前言 本系列是根据 B 站 尚硅谷 Docker 视频 学习记录笔记。因为没有视频课件&#xff0c;部分内容摘自 https://www.yuque.com/tmfl/cloud/dketq0。 本系列仅为自身学习笔记记录使用&#xff0c;记录存在偏差&#xff0c;推荐阅读原视频内容或本文参考笔记。 二、简单介…

通用开发技能系列:Authentication、OAuth、JWT 认证策略

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 通用开发技能系列 文章&#xff0c;主要对编程通用技能 Authentication、OAuth、JWT 认证策略 进行学习 1.Basic Authentication认证 每个请求都需要将 用户名密码 进行base64编码后&#xff0c;放在请求头的A…

基于隐私保护的可追踪可撤销密文策略属性加密方案论文阅读

论文是2022年发表的A Traceable and Revocable Ciphertext-Policy Attribute-based Encryption Scheme Based on Privacy Protection 摘要 本篇论文提出了一种具有用户撤销、白盒追踪、策略策略隐藏功能的CP-ABE方案。在该方案中密文被分为两个部分&#xff1a;第一个部分是和…

基于springboot实现教师人事档案管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现在线商城系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本ONLY在线商城系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理…

第六期丨酷雷曼无人机技能培训

第6期无人机技能提升培训 盼望着盼望着&#xff0c;第六期无人机技能提升培训会终于如期和大家见面了。 2024年1月1日&#xff0c;国务院、中央军事委员会颁布《无人驾驶航空器飞行管理暂行条例》&#xff0c;对民用无人机飞行活动实施更为严格的规范约束&#xff0c;越来越多…

阿里云服务器安装Java开发环境最佳实践

服务器环境安装 环境依赖服务器配置配置SSH登录打开安全配置端口远程连接配置秘钥 Linux服务器常用指令向远程服务器传送文件systemctl 相关 安装MySql安装步骤step1 检查并清除以前的mysql相关文件step2 安装step3 MySQL参数配置step4 设置开机启动step5 初始化数据库step6配置…

ABAP开发中常用弹窗的应用详解

在ABAP程序设计中为提示和交互的需要会经常用到弹窗&#xff0c; 所谓弹窗就是弹出一个框&#xff0c;告诉用户什么事情、需要确认什么、或者让用户输入什么内容等等&#xff0c;它价值在于通过提示、提醒、警告&#xff0c;帮助用户顺利完成业务流程中的必要操作或给用户提供实…

【JS】打乱数组顺序,用作领域:随机播放音乐

思路 循环数组随机获取数组下标取值&#xff1a; 取当前随机下标数组取当前循环的下标数组 相互替换步骤3的数组 /*** 随机数组顺序* param {Array} arr 数组* returns Array*/ const shufArr arr > {for (let i arr.length - 1; i > 0; i--) {const j Math.floor(M…

中国智慧城管哪家做的好?

智慧城市管理综合执法系统建立全市统一的法律法规、裁量基准、执法事项、执法文书和基础信息库&#xff0c;实现从获取线索、立案、调查、处理到结案全过程的信息化和文书制作的智能化。全面支持移动执法办案&#xff0c;提高执法效率。 技术架构&#xff1a; 微服务javasprin…