[BestCoder Round #88]Tree Cutting

本文介绍了解决特定子树计数问题的两种方法:一种利用树形DP结合点分治策略,另一种通过构建最高点模型并应用FWT进行快速计算。两种方法分别展现了树形数据结构上的动态规划技巧与快速沃尔特变换在优化计算方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

给定一棵 n 个节点的树,每个点有权值vi。‘
定义一棵树的权值为所有点权异或和。
现在对于 [0,m) 的所有整数 k ,请统计出这棵树有多少个联通子树的权值为k
联通子树:树的一个联通子图(显然它也是一棵树)
一个测试点 T 组数据。

1T10,1n103,1m210,vi[0,m)
保证 m 2的非负整数幂。


题目分析

Solution 1

考虑如果我们确定某个点是一定要选取的,那么我们将其作为根。
那么树中一个点如果选了,它的父亲一定要被选取。
这个树形依赖关系是不是特别熟悉?对了,就是和[JSOI2016]最佳团队类似的模型。
按照 DFS dp ,使用 fi,j 表示 i 一定要选,异或和为j的方案数。那么可以分两种选和不选两种情况考虑转移,和上面说的那题是一样的,很简单就不细讲了。
但是一次 dp O(nm) 的,难道我们要做 n 次?而且这样还会有重点。
可以发现一个点如果考虑过,那么就可以将问题分配到它的几个子树来分治了。这个就是经典的点分治,每次选取重心dp即可。
时间复杂度 O(nmlog2n)
很不错的一个思想。

Solution 2

1 作为树根,然后每个联通子树肯定有且仅有一个最高点。
fx,i表示 x 设为最高点,异或和为i的方案数。可以列出 dp 方程:

fx,i+=jkfx,jfy,k

这是标准的异或卷积形式,可以使用 FWT mlog2m 时间内计算出来。
我们会计算 O(n) 次(边数) FWT ,总时间复杂度 O(nmlog2m)
这个方法比较显然,但是像我这样的不会 FWT 的人在比赛时虽然是想出来了也无能为力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值