省选模拟80 题解
A. 数字
如果枚举 x and y 的取值,可以进行一个简单的dp。
dpi,0/1,0/1,0/1,0/1 表示从高到低到第 i 位,最高的几位分别是否与 lx,rx,ly,ry 相同,然后这个 dp 数组的取值也只有0/1。
所以可以 dp 套 dp。
在考虑过高位之后,需要记录的信息是这 24 种状态分别的取值,所以写一个 224 的状压。
每次考虑 x∧ y 的第 i 位取值为 0/1 ,分别进行转移即可。
B. 跳蚤
部分分提示了一些做法,可以对于 ti 的大小进行根号分治。
对于长度较大的,跳的次数不会很多,可以暴力维护。
对于长度较小的,对于每种长度用一个数据结构维护。
直接暴力复杂度就是 O(n1.5∗log)的。
然后对于其中一种 ti 比较大可以直接用分块优化,这样可以把复杂度降到 O(n∗sqrt(nlog))。
然后对于另外一种,不能优化的瓶颈主要在于下标出现负数并且绝对值太大,没办法分块。
但是需要注意随时只关注长度为 n 的连续段,所以可以把下标放在 mod 意义下考虑,这样就也可以分块优化了。
两种分块优化方法并不相同。
C. 棋盘
暴力 dp 做法显然。
因为 dp 的状态数实际上只有 2,3,7,所以可以考虑用矩阵、多项式来优化这个 dp。
其实就是给矩阵的每个位置都维护一个多项式。
其实暴力做就是 O(m log * |S|^3)的,其中 |S| 表示状态数。
但是暴力的做法常数肯定大的飞起。
然而其实只需要最终的多项式,所以可以直接把单位根的 i 次方代入转移矩阵中的 x,这样最终求出的就是要求的点值。
然后暴力 IDFT 插值出 x^k 项系数即可。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步