代表第 层第 个门。
代表该门及右边所有的门都移到最右边时,它的左边缘的位置。
代表该门及左边所有的门都移到最左边时,它的右边缘的位置。
我们要找最大的 。
一开始,所有的门都在右边,那么右边界 就是所有 的最小值,左边界 就是所有的 的最大值。
然后根据 R 从小到大枚举每扇门,将这扇门从右边推到左边,假设是 ,那就把 从集合中去掉,在集合中加入 ,得到新的右边界,这里可以通过 multiset 维护。
然后用 更新左边界,由于这是一个非递减(取 max)的过程,所以无须使用 multiset 记录集合。
该次的答案就是新的右边界剪掉新的左边界。
时间复杂度:,
为什么要根据 R 从小到大枚举?这样不会有问题吗?想一想。
不会,i 相同时,R 单调递增,所以每次拿出的一定是某一行还在右边的最左端的门