模拟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状态,直接进行拓展。

 

posted @ 2019-09-22 11:26  skyh  阅读(196)  评论(1编辑  收藏  举报