IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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

题意:给你一棵有 N N N 个节点的树,节点编号从 0 0 0 N ? 1 N-1 N?1 , 树边编号从 1 1 1 N ? 1 N-1 N?1 。第 i i i 条边连接节点 x i x_i xi? y i y_i yi? ,其权值为 a i a_i ai?

你可以对树执行任意次操作,每次操作选取一条链和一个非负整数 x x x,将链上的边的权值与 x x x 异或成为该边的新权值。

问最少需要多少次操作,使得所有边的权值都为 0 0 0

2 ≤ N ≤ 1 0 5 , 0 ≤ x i , y i ≤ N ? 1 , 0 ≤ a i ≤ 15 2\le N \le10^5,0\le x_i,y_i \le N-1,0\le a_i \le 15 2N105,0xi?,yi?N?1,0ai?15

第100篇博客啦!

首先可以想到:

边权不好处理,将其转化为点权

不过如果直接转化为点权似乎还是不好弄 q779想到这就没了

我们知道异或有自反性 ( p ⊕ q ⊕ p = q ) (p\oplus q \oplus p = q ) (pqp=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 两个点的修改

因为点权是异或和

所以同时修改路径上某个非端点结点所连的两条边,异或和不变(自反性)

首先,我们来证明几个结论


命题1 :当且仅当 ∑ u i ∈ V val ( u i ) = 0 \sum_{u_i\in V} \text{val}(u_i)=0 ui?V?val(ui?)=0 时, ∑ l i ∈ E w ( l i ) = 0 \sum_{l_i\in E} w(l_i) = 0 li?E?w(li?)=0

证明

  • 必要性证明:显然当边权和为 0 0 0 时,点权和也为 0 0 0

  • 充分性证明:设树上的结点数为 n n n ,若叶子结点 u u u 的点权为 0 0 0

则与其相连的边的边权也为 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


命题2:一个数字集合通过不断取两个数字并异或上同一个数有解,当且仅当这个数字集合异或和为 0 0 0

证明:显然,因为每次修改不会改变该集合的异或和。


命题3 ? u i ∈ V val ( u i ) = 0 \bigoplus\limits_{u_i\in V} \text{val}(u_i) = 0 ui?V??val(ui?)=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?)

复杂度怎么样呢?
O ( ∑ i = 1 15 C ? 15 i 2 i + n ) = O ( ( 1 + 2 ) 15 ? 1 + n ) = O ( 3 15 + n ) = O ( n ) \begin{aligned} O\left( \sum\limits_{i=1}^{15}\operatorname{C}_{15}^i2^i + n\right) &= O\left((1+2)^{15}-1 + n\right) \\ &= O(3^{15}+n) \\\\ &= O(n) \end{aligned} O(i=115?C15i?2i+n)?=O((1+2)15?1+n)=O(315+n)=O(n)?
代码如下

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N (int)(2e5+15)
int n,val[N],d[N],cnt[25],res,st,sxr[N];
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> n;
    for(int i=1,u,v,w; i<n; i++)
        cin >> u >> v >> w,val[u]^=w,val[v]^=w;
    for(int i=0; i<n; i++) ++cnt[val[i]];
    for(int i=1; i<=15; i++) res+=cnt[i]/2,st|=(cnt[i]&1)<<(i-1);
    for(int i=1; i<(1<<15); i++) d[i]=d[i>>1]+(i&1);
    for(int i=1; i<(1<<15); i++)--d[i];
    for(int i=1; i<(1<<15); i++)
        for(int j=0; j<15; j++)if((i>>j)&1)sxr[i]^=(j+1);
    for(int i=1; i<(1<<15); i++)
    {
        if(sxr[i]!=0)continue;
        for(int k=(i-1)&i; k; k=(k-1)&i)
            if(sxr[k]==0)d[i]=min(d[i],d[k]+d[i^k]);
    }
    cout << res+d[st] << endl;
    return 0;
}

讲个笑话,写完自己读一遍差点没读懂

参考文献

[1] https://www.luogu.com.cn/blog/ShadowassIIXVIIIIV/solution-at3913

[2] https://www.luogu.com.cn/blog/xzc/solution-at3913

转载清说明出处

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:44:27  更:2022-05-05 11:48:33 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码