联动:CodeForces - 527C Glass Carving (二分+set) 多维矩形切割问题
是同一道题,51Nod 数据加强。
题意:
给出一个高为 H ,宽为 V 的矩形。要经过 N 次切割,问每次切割后最大的一块是多少?
思路:
首先注意乘积爆 INT 。
为简化思考,本题题意为二维切割,我们不妨先考虑将问题转化为一位线段的切割问题思考。
我们可以通过维护 切点 及 从每个切点开始的线段长度 得知每次操作后的最大长度。
即 利用 数组 维护从每个切点开始的线段长度
利用 set 维护 切点
利用 multiset 维护 所有线段的长度 以便求最大长度
在增加切点时利用 set 的二分查找和 multiset 的相关操作可以将效率压在 log(N)。
二维,多维同理
但是在 51 nod 仍是TLE 的。
于是进行了如下优化:
所有线段的长度 利用 set + 一个数组 维护,免去重复删除同样长度数据带来的多余的操作。
优化后仍有可能超时,但最多 100ms。
所以以下代码得看服务器心情 AC 。
代码: