| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> AT3913 XOR Tree 题解 -> 正文阅读 |
|
[数据结构与算法]AT3913 XOR Tree 题解 |
AT3913 XOR Tree 题解题目链接:AT3913 XOR Tree
首先可以想到: 边权不好处理,将其转化为点权 不过如果直接转化为点权似乎还是不好弄 我们知道异或有自反性 ( p ⊕ q ⊕ p = q ) (p\oplus q \oplus p = q ) (p⊕q⊕p=q) 等性质 则考虑将点权定义为 val ( u ) = ? v i ∈ V ∧ ( u , v i ) ∈ E w ( u , v i ) \text{val}(u) = \bigoplus\limits_{v_i \in V \land (u,v_i) \in E}w(u,v_i) val(u)=vi?∈V∧(u,vi?)∈E??w(u,vi?) 也就是和每个结点直接相邻的边的边权的异或和 此时我们就将边权映射到了点权上(注意本题可以看作一棵无向无根树) 路径 u ? v u-v u?v 的修改转化为了 u , v u,v u,v 两个点的修改 因为点权是异或和 所以同时修改路径上某个非端点结点所连的两条边,异或和不变(自反性) 首先,我们来证明几个结论
证明:
则与其相连的边的边权也为 0 0 0 ,因此这条边不会影响到 u u u 的父结点,归纳可得 ∑ u i ∈ V val ( u i ) = 0 ? ∑ l i ∈ E w ( l i ) = 0 \sum_{u_i\in V} \text{val}(u_i)=0 \Rightarrow \sum_{l_i\in E} w(l_i) = 0 ui?∈V∑?val(ui?)=0?li?∈E∑?w(li?)=0
证明:显然,因为每次修改不会改变该集合的异或和。
证明:显然,每条边都有两个端点,根据自反性可得。 这样,我们就可以贪心地选择两个点权相同的结点消掉了 可是如果没有没有点权相同的结点了怎么办呢? 可以发现,此时最多有 16 16 16 个互不相同的数字,而 0 0 0 不用考虑,因此最多只有 15 15 15 个数字 考虑状压dp 令 d p s dp_s dps? 为将数字集合 s s s 全部变为 0 0 0 的最小操作数 显然至多要 ∣ s ∣ ? 1 |s|-1 ∣s∣?1 次操作(也就是原图中一条条边消) 直接去搞是有后效性的,所以考虑如何转移 我们可以枚举 s s s 的一个子集 k k k ,则有 d p s = min ? ( d p s , d p k + d p s / k ) dp_s = \min(dp_s,dp_k+dp_{s/k}) dps?=min(dps?,dpk?+dps/k?) 复杂度怎么样呢?
参考文献: [1] https://www.luogu.com.cn/blog/ShadowassIIXVIIIIV/solution-at3913 [2] https://www.luogu.com.cn/blog/xzc/solution-at3913 转载清说明出处 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:49:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |