康复训练

6 月 29 日

Comet OJ #6 D

Comet OJ #6 D

题意:给定一棵 $n(n \le 100000)$ 个点的树。在至少两个点上放棋子,每一个回合将所有棋子移向父亲,存在棋子重合时结束。问所有的 $2 ^ n - n - 1$ 个初始棋局的回合数的和,对 $998244353$ 取模。

分析:求出 BFS 序,进行 $T$ 个回合之后,转移到的点相同 的 位置必然被划分到连续一段。

$$\begin{aligned} \sum_{S} \text{S 能进行的回合数} & = \sum_S \sum_{T \ge 0} [\text{S 能进行超过 T 个回合}] \\ & = \sum_{T \ge 0} \sum_S [\text{S 能进行超过 T 个回合}] \end{aligned}$$

用并查集维护 BFS 序并统计答案。剩下的问题就是判断 BFS 序的每个位置在什么时候与下一段合并:找当前这个点与深度相同的下一个点的 LCA (也就是 BFS 序的下一个),将 dep 相减即可判断合并的回合。

思考一

细化理解一下对所求量的转化,也就是阿贝尔求和公式。

我可以改编这样一个问题:给定一棵 $n(n \le 100000)$ 个点的树。在至少两个点上放棋子,每一个回合将所有棋子移向父亲,存在棋子重合时结束,设共进行了 $T$ 个回合,贡献 $a[T]$ 。问所有的 $2 ^ n - n - 1$ 个初始棋局的回合数的贡献之和,对 $998244353$ 取模。

$$\begin{aligned} \sum_{S} a[\text{S 能进行的回合数}] & = \sum_S \sum_{T \ge 0} [\text{S 能进行超过 T 个回合}] (a[T+1] - a[T]) \\ & = \sum_{T \ge 0} (a[T + 1] - a[T]) \sum_S [\text{S 能进行超过 T 个回合}] \end{aligned}$$

思考二

给定一棵 $n(n \le 100000)$ 个点的树。在至少两个点上放棋子,每一个回合将所有棋子移向父亲,存在棋子重合时结束。多组询问,每次给定 $k$ ,问选择 $k$ 个棋子至多能进行多少回合。

把 $T$ 个回合的段数求出来,对这个数组进行二分。

猜你喜欢

转载自www.cnblogs.com/Sdchr/p/11106344.html