模拟49 题解
A. 养花
对原序列分块,预处理出每个块内对于每个 $k$ 的答案。
预处理的过程可以用调和级数的性质,这样对于每个块都 $O(V \text{ln} V)$ 预处理
对于询问,大块直接统计,小块暴力就可以了。
设值域为 $V$,块的大小为 $q$,那么总共有 $\frac{n}{q}$ 个块。
总复杂度为 $O(\frac{n}{q} \times V \text{ln}V + m \times (q+\frac{n}{q}))$。
不妨设 $n,m,q$ 同级,利用均值不等式可得当 $q=\sqrt{n\text{ln}n}$ 时最优。
B. 折射
按 $y_i$ 排序,即从左到右自动满足条件 $1$。
设 $dp_{i,j}$ 表示最后一个的横坐标为 $i$,倒数第二个的横坐标为 $j$。
那么可以写出简单的 dp 转移,前缀和优化一下就可以 $O(n^2)$。
然而会被卡空间,发现 dp 数组只用了一半,所以用等差数列把它拍到一维上就可以了。
正解是将点按$x$排序,
利用当前枚举点最靠右,那么一定是第一或第二个点的性质,设为向右/左拐,可以进行 $dp$。
C. 画作
结论:存在一种最优方案,使得操作区域不断为前一次操作区域的子集,并且相邻两次涂的颜色不同。
因为看不懂证明,所以不写证明,所以复制题解的证明:
考虑归纳证明, 记 S 为当前所有操作区域的并, T 为接下来一步的操作区域, 我们有:
1. T 与 S 有交的情况一定可以转化成 T 被 S 包含的情况。
2. T 与 S 交集为空时, 可以找一个连接 S 和 T 的集合 M 并操作 S ∪T ∪ M,
并将之前的所有操作连接到更外的层以及外层的连接部分同时操作,
特殊处理最外层和第二层的情况。
3. T 被 S 包含时,T 落在某个完整区域内时等价于情况二,否则一定连接若干个同色块,
这些块可以同时处理,步数一定不会更劣。
证明了以上结论,枚举起始点不断进行bfs,复杂度可以$O(n^5)$。
将同色的联通块视作0边,异色联通块视作1边,进行双端队列bfs,可以$O(n^4)$。
更容易理解的是继承上一层的bfs状态,直接进行拓展。