2024“钉耙编程”中国大学生算法设计超级联赛(6)

Problems AC
7494. 造花(简单版) ○
7495. 造花(困难版) ⊕
7496. 飞车狂飙 ○
7497. 不醒人室 ○
7498. 交通管控 ⊕
7499. 解方程 格基归约,弃疗
7500. 树上 MEX 问题 ⊕
7501. 树形 DNA 待补
7502. 数字加减 大模拟,弃疗
7503. Rikka 与子集 IV 多项式,弃疗
7504. 天天爱跑步 待补

1001 造花(简单版)

1007 树上 MEX 问题

MEX,数数

给定一棵 n 个点的树,每个点有点权,点权是 0 到 n - 1 的排列,求所有连通块(连通导出子图)的 MEX 之和。

$1 \le n \le 10^5$

好题,学到了

直接的统计答案是 枚举 i,对 i * 恰好 mex = i 的子图数量 求和。这样的话答案是很难算的。

众所周知在这类问题上有个常见的 trick 是在 钦定 和 恰好之间转换。

假如我们钦定[0, i - 1] 这 i 个点选的话,剩下随意,那么 mex 只能是 >= i 的。这个数量我们其实是更方便求一点的。

换言之,假设我们求出了 mex >= i 的子图数量 $num_i$ 。那么恰好 mex = i 的子图数量就是 $num_i - num_{i + 1}$

$$
ans = \sum_{i = 1}^{n}{i \times (num_i - num_{i + 1})}
= \sum_{i = 1}^{n}{i \times num_i} - \sum_{i = 2}^{n + 1}{(i - 1) \times num_i}
= num_1 + \sum_{i = 2}^{n}{num_i} - n \times num_{n + 1}
= \sum_{i = 1}^{n}{num_i}
$$

接下来考虑如何计数 $num_i$。

跑一个 $dp_u = \prod_{v \in son(u)} (dp_v + 1)$ 表示 u 这个点必选,u 和 u 的子树能构成的联通子图数量。

将 0 作为树的 rt。那么 [0, i] 这些点以及路径上的其他点都是必选的,我们把这看成一个集合 S。剩下的点都是可选可不选。$num_i$ 就等于所有和 S 这坨东西直接相连且不在 S 里面的点的 (dp_v + 1) 的乘积

那么在 S 集合新加进来一个点的时候,只需要不断往上跳,大力维护:原来是可选可不选的 (dp_v + 1),现在是必须要选的 (dp_v)。

因为每个点最多只会被加入到 S 一次,所以是对的。

1011 天天爱跑步

基环树

给一棵基环树,对每个点 i 求过 i 的最长简单路径。

$1 \le n \le 10^5$

假如不是基环树,是一棵树,那么答案是好求的,一个点无非是两条往下或者一条往下一条往上的拼起来,这个东西是很好 dp 的。

如果是基环树,一个环挂着很多树。一个点 i 往下走的最长路径是 $mxd_i$,那么每个 i 就是要找个 j 配对,构成一个 $mxd_i + mxd_j + 环上路径$

2024“钉耙编程”中国大学生算法设计超级联赛(6)

https://tosakaucw.github.io/2024“钉耙编程”中国大学生算法设计超级联赛(6)/

Author

TosakaUCW

Posted on

2024-08-07

Updated on

2024-08-11

Licensed under

Comments