Skip to content
Ficon's Paper
Go back

CF2181D

[i,j][i, j] 代表第 ii 层第 jj 个门。

Li,jL_{i, j} 代表该门及右边所有的门都移到最右边时,它的左边缘的位置。

Ri,jR_{i, j} 代表该门及左边所有的门都移到最左边时,它的右边缘的位置。

我们要找最大的 LRL - R

一开始,所有的门都在右边,那么右边界 curLcurL 就是所有 Li,1L_{i, 1} 的最小值,左边界 curRcurR 就是所有的 Ri,0R_{i, 0} 的最大值。

然后根据 R 从小到大枚举每扇门,将这扇门从右边推到左边,假设是 [i,j][i, j],那就把 [i,j][i, j] 从集合中去掉,在集合中加入 [i,j+1][i, j + 1],得到新的右边界,这里可以通过 multiset 维护。

然后用 Ri,jR_{i, j} 更新左边界,由于这是一个非递减(取 max)的过程,所以无须使用 multiset 记录集合。

该次的答案就是新的右边界剪掉新的左边界。

时间复杂度:O(MlogM)O(MlogM), M=n+i=1nkiM= n + \sum_{i = 1}^nk_i

为什么要根据 R 从小到大枚举?这样不会有问题吗?想一想。

不会,i 相同时,R 单调递增,所以每次拿出的一定是某一行还在右边的最左端的门


Share this post on:

Previous Post
2024-Zhejiang-J
Next Post
CF1777E