2 条题解
-
0
OU 瑞平:你这玩意跟我那个做法感觉没啥区别啊,唯一的区别可能是,常数变大了
写这篇题解的人真是太不牛了。
考虑对原树进行 Top Cluster 分块,这可以将原树的边集不重不漏划分为 个大小为 的块。我们先求出 LCA 为 的所有答案,然后做树上前缀和即可。
对于单点 ,考虑引起贡献的两个点。如果 不是这棵簇的界路径上的点,那么引起贡献的 均与 在同一棵簇内,可以直接 复杂度内暴力解决。
否则,下面的所有点 都在某棵簇的界路径上。我们考虑这样的问题:对于当前节点 ,有一个数组 ,其中 表示满足 ,且 路径上的所有出现过点权集合为 的种类数。如果给出 ,且仅统计所有 的贡献,那么答案是
我们可以换一个角度理解这个事情,假设我们在做 FWT,那么我们在 每一维做一个神秘的线性变换到 :。答案是 。这同样可以 计算答案。
我们假设这棵簇真的就长得像一条链,那么每次 向上的时候只需要把所有 的 值加到 里,并且对原 清零。即可。这条链的长度是 的,但是有意义的合并只会发生 次,而 ,所以复杂度依旧是 。
现在这棵簇长得不像一条链了!但是在 ,我们可以枚举所有簇内的 (其实是包括 的)满足 的最近簇路径节点为 ,这时我们再枚举簇外节点 即可补全贡献。所有 的信息被携带在数组 里,我们只要让 表示 到 路径上所有出现颜色集合,那么 事实上就是所有可能 和 的路径答案之和。只要计算出 ,贡献是容易简单统计的。
最后,答案唯一可能出现问题的是所有的簇界点,因为它可能同时是若干个簇的上界点,我们在 FWT 暴力合并不同簇的 数组时加入贡献即可。
时间复杂度即为 。
信息
- ID
- 116
- 时间
- 9000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 130
- 已通过
- 14
- 上传者