<span>省选模拟86 题解</span>

A. 人生

有一点 dp 套 dp 的意思,内层的 dp 就是直接在拓扑序上进行的简单 dp。

外层记录的是 dp 的状态,然后 $O(n^3)$ 的做法是显然的。

当转移到第 $i$ 个位置的时候,只要关心前面有多少个黑点 dp 值为 $1$,前面有多少个白点 dp 值为 $1$,前面的 dp 值总和的奇偶性。

然后写一下转移系数,发现这个玩意是一个简单的组合恒等式,与具体多少个异色点无关,只与是否有异色点有关。

所以可以把 dp 的多少个改成是否存在,然后直接转移就行了。

 

B. 赢家(winner)

考虑怎样的方案是不合法的,其实就是 $1$ 能到达的点集与 $2$ 能到达的点集无交。

可以用 dp 处理出两个集合内部的方案数,然后对于全集减去两个点集内部的边,方向任意。

两个集合之间不能有任何边,两个集合到全集减去两个点集之间的边方向唯一。

然后问题是处理出从点 $i$ 通过 $S$ 内部的边恰好到达集合 $S$ 的方案数,求的方法是直接用全集-补集。

补集其实就是枚举 $S$ 的一个子集 $T$,使得通过 $S$ 之内的边只能到达集合 $T$。

那么 $S-T$ 连边任意,$T$ 内连边是已经处理过的方案数,$T$ 和 $S-T$ 之间的边的方向也是唯一的。

 

C. 黑红兔

有这样一个性质,答案中的字符串长度可以是连续的。

所以可以认为 $[l,r]$ 的后继是 $[l+1,r]$ 或者 $[l,r-1]$。

然后正着进行 dp 并不容易处理,所以倒过来 dp,每次只要选择一个后继。

令 $f_{i,len}$ 表示以 $i$ 为起点,长度为 $len$ 是否存在,取值为 $0/1$。

然后有这样一个性质,枚举了一个左端点 $i$,那么取值为 $1$ 的 $f_{i,len}$ 是一段前缀。

所以其实只要令 $f_i$ 表示左端点为 $i$ 的最大的 $len$。

假设 $f_i=k$,那么限制就是从 $s[i+k:n]$ 中找到 $s[i,i+k-2]$ 或者 $s[i+1,i+k-1]$,并且这个点的 $f$ 值应该 $\geq k-1$。

解决这个东西的方法是二分答案,还有一个问题是字符串的限制。

其实就是使得 $lcp \geq k-1$,所以写一个后缀自动机就可以转化为 DFS 序上一段连续的区间,然后写一个主席树就可以做到两个 $log$ 了。

然后优化的方法是继续找性质,有 $f_i \leq f_{i+1}+1$,所以只要把二分改成暴力判断即可。

全部评论

相关推荐

11-09 11:01
济南大学 Java
Java抽象带篮子:外卖项目真得美化一下,可以看看我的详细的外卖话术帖子
点赞 评论 收藏
分享
10-09 09:39
门头沟学院 C++
HHHHaos:这也太虚了,工资就一半是真的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务