CF1930G 题解
sunkuangzheng · · 题解
题目链接。
给定
n 个点的树,问所有 dfs 序只保留前缀\max 后有多少不同的数组,模998244353 。“只保留前缀\max ” 指去除所有非前缀\max 元素,例如[2,5,3,6,1] \to [2,5,6] 。
考虑 DP。设
- 性质一:
a_{i+1} 是a_i \to a_{i+1} 路径上的最大值,且a_i 是路径上的次大值。
分两种情况:如果
a_i 是a_{i+1} 的祖先,那么路径上如果存在大于a_{i} 的元素x ,元素x 一定在a_i 和a_{i+1} 之间,导致a_i 和a_{i+1} 在a 数组中下标不相邻,矛盾。如果
a_i 不是a_{i+1} 的祖先,令d = \operatorname{lca}(a_i,a_{i+1}) ,显然a_i \to d 的路径上不存在大于a_i 的元素。d \to a_{i+1} 的路径上若存在>a_{i} 的元素则同理可发现矛盾。
- 性质二:若
a_i 不是a_{i+1} 的祖先,令d = \operatorname{lca}(u,v) ,k 为a_i 的dep_{a_i}-dep_d-1 级祖先,则a_i 是k 子树里的\max 。
如果
k 子树里存在大于a_i 的元素x ,如果它的 dfs 序在a_i 前面则a_i 不是前缀\max ,如果在a_i 后面则x 会在a_i 和a_{i+1} 之间。
我们可以开始 DP 了。如果
当然我们还可以让 DP 式子更加简洁:注意到