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