<span>省选模拟80 题解</span>
A. 数字
如果枚举 $x\ and \ y$ 的取值,可以进行一个简单的dp。
$dp_{i,0/1,0/1,0/1,0/1}$ 表示从高到低到第 i 位,最高的几位分别是否与 $lx,rx,ly,ry$ 相同,然后这个 dp 数组的取值也只有0/1。
所以可以 dp 套 dp。
在考虑过高位之后,需要记录的信息是这 $2^4$ 种状态分别的取值,所以写一个 $2^{2^4}$ 的状压。
每次考虑 $x \and \ y$ 的第 $i$ 位取值为 $0/1$ ,分别进行转移即可。
B. 跳蚤
部分分提示了一些做法,可以对于 $t_i$ 的大小进行根号分治。
对于长度较大的,跳的次数不会很多,可以暴力维护。
对于长度较小的,对于每种长度用一个数据结构维护。
直接暴力复杂度就是 $O(n^{1.5} *log )$的。
然后对于其中一种 $t_i$ 比较大可以直接用分块优化,这样可以把复杂度降到 $O(n * sqrt(nlog))$。
然后对于另外一种,不能优化的瓶颈主要在于下标出现负数并且绝对值太大,没办法分块。
但是需要注意随时只关注长度为 $n$ 的连续段,所以可以把下标放在 $\bmod n$ 意义下考虑,这样就也可以分块优化了。
两种分块优化方法并不相同。
C. 棋盘
暴力 dp 做法显然。
因为 dp 的状态数实际上只有 $2,3,7$,所以可以考虑用矩阵、多项式来优化这个 dp。
其实就是给矩阵的每个位置都维护一个多项式。
其实暴力做就是 $O(m log * |S|^3)$的,其中 $|S|$ 表示状态数。
但是暴力的做法常数肯定大的飞起。
然而其实只需要最终的多项式,所以可以直接把单位根的 $i$ 次方代入转移矩阵中的 $x$,这样最终求出的就是要求的点值。
然后暴力 $IDFT$ 插值出 $x^k$ 项系数即可。