[AGC052B] Tree Edges XOR

news/2024/11/16 17:58:01/文章来源:https://www.cnblogs.com/Jack-YT/p/18351544

好题,可以直接作为套路记录一下。

[AGC052B] Tree Edges XOR

题目大意:

给你一棵树,有奇数个点,每个边有边权 \(w_i\)。每次你可以选出一条边,将和这条边的所有相邻的边都异或这条边的边权,问你能否得到最终状态(操作次数不定)。

思路:

首先,上来会发现每次操作影响的边十分多,肯定无法直接维护,考虑转化。

操作是异或,那异或有什么性质呢?答案是“某个数异或同一个数两次,数值不变”。

那我们考虑,当我们进行一次操作时,什么由于这个性质是不变的,或是变得很少。

如果某个东西改变的很少,我们就可以转化了。

如下图,如果我们对红色的边进行了操作(有紫色标记的边是被修改的)。

image

可以发现从根到 \(4\) 号子树的路径没有任何修改,同时根到 \(1\)\(2\)\(3\) 号子树的路径上都有两条边被异或了一次。

所以根到这些点的路径异或和都没有任何改变。

但是进行操作的这条边的两端 \(x\)\(y\),它们的路径异或和有所改变。

我们设这条边的边权为 \(w\),它们原来的路径异或和分别为 \(dis_x\)\(dis_y\),修改后就变成了 \(dis_x'\)\(dis_y'\),我们来看看它们前后之间的关系。

可以发现:

\[dis_x'=dis_x \text{^} w=dis_y\\ dis_y'=dis_y \text{^} w=dis_x \]

就是将两个数值交换了。

所以我们可以将边权设为到根的路径异或和,每次就是交换两个边的边权。

但是操作边还是不好做,可以直接下放边权为点权,这样题目就变成了“每次交换两个点上的数字,问是否可以达到目标状态”。

那这道题就结束了吗?还没有。

注意到因为我们的点权是到根的路径异或和,所以根节点的值应该一直为 \(0\),但是如果涉及到根节点和它儿子之间的边进行操作的时候,一旦交换根节点的点值,就无法保证根节点是 \(0\) 了。

这是因为根节点上方没有别的边了,所以无法满足性质,那我们可以在加一个虚拟点,向根节点连边,即给根节点一个虚拟的父亲节点,这样,在进行原问题的操作的时候,对周围的所有边进行异或,就也给这条虚拟边进行异或,这样,根节点的性质就也可以被满足了。

到了这一步,还是有问题,就是我们在计算点权的时候,初始状态下虚拟边的 \(w\) 肯定是 \(0\),但是目标状态的权值由于可能会进行多次异或操作,所以不一定是 \(0\)

那应该是什么呢?

可以发现,转化之后的题目每次就是交换两个点值,不会改变点值,所以点值的种类和数量都不会改变,那么如果最终态可以达到,则初始状态和最终状态的所有数的异或和必然相同。而且由于题目保证了点的数量为奇数,所以在最终状态的所有点的异或和中虚拟边的边权一定是异或了奇数遍。

那我们就可以知道,将初始和目标状态的所有点值的异或和再异或起来,得到的数就是虚拟边的边权,即为原本根节点的点值。

然后再把这个值带回到目标状态,计算出所有的点值,看看是否和初始状态一样就好了。

Code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define lowbit(x) (x&(-x))
inline int read(){int rt=0;	char g=getchar();while(g<'0'||g>'9')	g=getchar();while(g>='0'&&g<='9')	rt=(rt<<3)+(rt<<1)+g-'0',g=getchar();return rt;
}
int n,w[2],qwq;
int dis[2][100005];
struct node{int to,w[2];};
vector<node>t[100005];
inline void dfs(int now,int fa,int opt)
{w[opt]^=dis[opt][now];for(int i=0,to;i<t[now].size();i++){to=t[now][i].to;	if(to==fa)	continue;dis[opt][to]=dis[opt][now]^t[now][i].w[opt];dfs(to,now,opt);}
}
int main()
{n=read();for(int i=1,u,v,w1,w2;i<n;i++){u=read(),v=read(),w1=read(),w2=read();t[u].push_back({v,w1,w2});t[v].push_back({u,w1,w2});}dfs(1,0,0);	dfs(1,0,1);	qwq=w[0]^w[1];for(int i=1;i<=n;i++)	dis[1][i]^=qwq;sort(dis[0]+1,dis[0]+1+n);sort(dis[1]+1,dis[1]+1+n);for(int i=1;i<=n;i++)	if(dis[0][i]!=dis[1][i])	return puts("NO"),0;puts("YES");return 0;
}

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

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

相关文章

[JVM] 应用诊断工具之java命令

0 序本章对java命令的使用、最佳实践进行全方位的总结。1 java命令 1.0 场景:查看版本方法1# java -version java version "1.8.0_261" Java(TM) SE Runtime Environment (build 1.8.0_261-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)方…

洛谷 P1127 词链——题解

洛谷P1127题解传送锚点摸鱼环节 词链 题目描述 如果单词 \(X\) 的末字母与单词 \(Y\) 的首字母相同,则 \(X\) 与 \(Y\) 可以相连成 \(X.Y\)。(注意:\(X\)、\(Y\) 之间是英文的句号 .)。例如,单词 dog 与单词 gopher,则 dog 与 gopher 可以相连成 dog.gopher。 另外还有一…

引领敏捷潮流:首届中国Scrum大会即将揭幕

中国「首届Scrum大会」将于2024年8月17日在上海大华虹桥假日酒店盛大召开。在全球数字化转型的浪潮中,敏捷已成为企业脱颖而出的关键。本次大会汇聚了Scrum领域的顶尖专家、实践者及企业领袖,共同探讨AI时代下的敏捷(Agile in the AI Age),深入探索智能时代的敏捷路径,掌…

解锁数学之美:VuePress博客如何优雅地呈现复杂公式

聊聊如何让 VuePress 显示数学公式块。聊聊如何让 VuePress 显示数学公式块。 ‍ 什么是数学公式块 如果你还不了解,可以先看看我的 Markdown 教程——Markdown 与数学公式。 ‍ ‍ 安装依赖 相关插件有很多,我这里选择的是 markdown-it-mathjax3​: npm i markdown-it-math…

【攻防】一个关于内网渗透过程的小技巧

在我们打攻防进行内网渗透的过程中,很多时候需要去收集内网的密码字典再对内网主机进行批量的密码喷洒。 这里密码获取的手段有很多,例如: 1、mimikatz抓取入口主机密码 2、翻查入口主机中关于密码的文件(例如数据库密码) 3、web系统的密码 4、自己构造目标的密码字典(xx…

matlab求解线性规划问题

在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济效益的问题。此类问题构成了运筹学的一个重要分支--数学规划,而线性规划(LinearProgramming,LP)则是数学规划的一个重要分支。本章会介绍线性规划模型与matlab求解 目录一、线性规划的标准形二、linpro…

snap和apt的区别简单了解[]

Linux中没有tree命令的时候提示安装的时候出现了两个命令,简单看了看两者有何区别(一般用apt就可以了): sudo snap install tree 和 sudo apt install tree 这两个命令都是用来安装 tree 命令行工具的,但它们使用的是不同的包管理器和软件源。Snapsnap 是由 Canonical 开…

Cisco ASAv 9.20.3 - 思科自适应安全虚拟设备 (ASAv)

Cisco ASAv 9.20.3 - 思科自适应安全虚拟设备 (ASAv)Cisco ASAv 9.20.3 - 思科自适应安全虚拟设备 (ASAv) Cisco Adaptive Security Virtual Appliance (ASAv) 请访问原文链接:https://sysin.org/blog/cisco-asav/,查看最新版。原创作品,转载请保留出处。 思科自适应安全虚拟…

字符串 md5在线生成的小工具

经常会找到md5字符串,然后需要一个在线工具:https://coding.tools/cn/md5道法自然

使用 defineNuxtRouteMiddleware 创建路由中间件

title: 使用 defineNuxtRouteMiddleware 创建路由中间件 date: 2024/8/10 updated: 2024/8/10 author: cmdragon excerpt: 本篇文章介绍了如何使用 defineNuxtRouteMiddleware 创建和应用路由中间件。通过示例演示了如何处理错误页面和身份验证逻辑。随着对 Nuxt.js 中间件的…

Spring AI 更新:支持OpenAI的结构化输出,增强对JSON响应的支持

就在昨晚,Spring AI发了个比较重要的更新。由于最近OpenAI推出了结构化输出的功能,可确保 AI 生成的响应严格遵守预定义的 JSON 模式。此功能显着提高了人工智能生成内容在现实应用中的可靠性和可用性。Spring AI 紧随其后,现在也可以对OpenAI的结构化输出完美支持了。 下图…