<span>模拟49 题解</span>

A. 养花

利用根号的一些性质,可以得到很多在最坏情况下$n\sqrt n logn$的算法,

然而出题人似乎根本没有给这个算法分的意思。

正解是分块。

预处理出每个块内对于每个k的答案。

对于询问,大块直接统计,小块暴力就可以了。

设值域为s,块的大小为q,那么总共有$\frac{n}{q}$个块。

总复杂度为$O(\frac{n*s*ln(s)+n^2}{q}+m*(q+\frac{n}{q}))$。

不妨设$n=m=q$,利用均值不等式可得当$q=\sqrt{n*ln(n)}$时有最小值。

 

 

 

B. 折射

按$y$排序,即自动满足条件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状态,直接进行拓展。

 

全部评论

相关推荐

11-01 08:48
门头沟学院 C++
伤心的候选人在吵架:佬你不要的,能不能拿户口本证明过户给我。。球球了
点赞 评论 收藏
分享
像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务