1.16模拟赛题解

T1

对于区间 \([1,i]\) 的划分方案,划分长度一定是 \(i\) 的因数,因此考虑暴力枚举区间长度。

问题转化为快速 check 一段区间是不是美丽的。

首先,区间内的 \(-1\) 一定要么全部变成左边的第一个非 \(-1\) 值,要么全部变成右边的第一个。这样就处理掉了所有的 \(-1\),只需要考虑确定的值了。

考虑利用 st 表求出区间内最大值的位置,再用两个 st 表维护差分序列,check 两边是否是单调的。单次 check 的复杂度就做到了 \(O(1)\)

总复杂度 \(O(n\log n)\)

T2

考虑暴力转移,得到方程 \(dp_{i,j}=\min\{dp_{k,j-1}+\max\{a_{k+1}\,\cdots a_i\}\}\)

考虑优化。设 \(minx_i\) 表示钦定 \(a_i\) 为区间最大值时的最优决策点。维护单调栈,每次 pop 掉一个元素时都对 \(minx_i\) 进行 chkmin。另一种可能是 \(a_i\) 不是最大值,那么需要把它与它左边第一个大于它的位置的 dp 值取 min。

时间复杂度 \(O(n^2)\)

T3

暴力。

T4

\(dp_{i,j}\) 表示前 \(i\) 个按键,第 \(i\) 个按键为 \(j\) 的方案数。

那么 \(dp_{i,j}\) 能够转移到 \(dp_{k,j+1}\) 就代表 \(t_{i,k}\in[p_j-L,p_j+L]\)

注意到 \(t\) 具有单调性,因此可以直接二分找到转移区间,然后差分维护。

时间复杂度 \(O(nk\log k)\)

posted @ 2023-01-16 15:52  Egg_eating_master  阅读(37)  评论(0)    收藏  举报