luogu P2664 树上游戏 题解

本文详细解析了luogu P2664树上游戏的题解,通过离线算法和点分治方法解决树上颜色序列统计问题。介绍了如何在O(n)或O(nlogn)复杂度下,统计以节点为LCA的点对贡献,利用开桶技术避免暴力计算,并在DFS过程中处理根到每个节点的贡献。
摘要由CSDN通过智能技术生成

l u o g u   P 2664   树 上 游 戏 \tt luogu\ P2664 \ 树上游戏 luogu P2664 

题目大意:

一棵树上每个节点都有颜色,给定一个长度为 n n n 的颜色序列,定义 s ( i , j ) s(i, j) s(i,j) i → j i \to j ij 的颜色数量。

s u m i = ∑ j = 1 n s ( i , j ) sum_i = \sum_{j = 1} ^ n s(i, j) sumi=j=1ns(i,j)。求所有的 s u m i sum_i sumi


这个本质可以看成树上的点对的问题。既然不考虑在线我们可以使用离线算法点分治。

我们需要在 O ( n ) O(n) O(n) 或者 O ( n log ⁡ n ) O(n \log n) O(nlogn) 的复杂度完成统计以当前节点为 l c a lca lca 的点对的所有贡献。

显然暴力统计是不行的。考虑借鉴一下统计树上距离为 k k k 的点对的方法,开桶进行计算。

首先考虑以根节点为起点的方案数,也就是考虑每一条链上第一个出现的节点,其对于根的贡献是其子树大小。

其子树中每一个点都会产生一次这样颜色的贡献。

为了方便统计我们将根节点的颜色也加上贡献,同时提前打上标记。

之后需要统计点对的贡献。我们不妨将上一次产生贡献的点的贡献记成 f ( i ) ​ f(i)​ f(i)。那么不产生贡献显然是 f ( i ) = 0 ​ f(i) = 0​ f(i)=0

既然是统计子树中的贡献。考虑遍历每一个子树。

对于每个点的贡献就是。设当前的颜色集合为 S ​ S​ S。点集合是 T ​ T​ T,子树的大小是 S i z ​ Siz​ Siz

∑ f − ∑ v ∈ T f ( v )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值