1 条题解
-
0
自动搬运
来自洛谷,原作者为

chen_zhe
Aya 敲可爱的~搬运于
2025-08-24 22:52:12,当前版本为作者最后更新于2023-11-05 21:50:38,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
以下内容转载自官方题解:
枚举平行于 轴和 轴的平面(下称平面 )的位置。和平面 有交的矩形就不用考虑了,和它无交的矩形就必须和平面 和平面 之一有交。平面 在移动的过程中,即平面 的 坐标在从 变化到 的过程中,每个矩形和平面 有交的时间是连续的一段。在这段时间外,这个矩形必须和平面 或平面 有交,即 或 ,其中 为矩形 坐标最小值, 为矩形 坐标最大值, 和 类似, 为平面 的 坐标, 为平面 的 坐标。画在 平面上,就是 平面在 平面上的投影(一条平行于 轴的直线)和 平面在 平面上的投影(一条平行于 轴的直线)的交必须在以矩形为中心的红十字形状内。也就是二维版的本问题。
在二维版的本问题中,要判断的其实是每个矩形对应的红十字形状的交是否为空。我们取红十字形状的补集,即左上,右下,左下,右上 个不封闭矩形区域。所有矩形的左上区域的并构成了左上的一条轮廓线,其它 个角类似,这 条轮廓线外的区域即为所有红十字形状的交。如果要判断交是否为空,可以先将 和 坐标的范围限制为 ( 为本题坐标范围),为每个 坐标计算该 坐标上(上=on, 不是 above)有多少 坐标位于轮廓线外。对于一个 坐标,在这个 坐标上的 坐标其实有两个下界和两个上界,分别由左上左下右上右下轮廓提供,下界取较大的生效,上界取较小的生效。
在三维版本的问题中,我们要维护上述 条轮廓线,同时维护每个 坐标上有多少 坐标位于轮廓线外。我们将所有 坐标按照 坐标的下界和上界由谁提供分为 类(下界可能由左上或者左下轮廓提供,上界则由右上或者右下轮廓提供)。每一类用一棵线段树维护上下界的差。为了方便每一类的线段树都包含每个 坐标。线段树支持查询是否有大于 的元素。当轮廓线修改时,每段修改可用线段树区间加操作实现(等下会讲有多少修改)。由于轮廓线都是单调的,肯定 坐标较大的部分由左上提供下界,较小的部分由左下提供。如果我们能维护一个轮廓线端点的 set,则可以在 set 上二分出左上和左下轮廓相交的位置。右侧类似。这样我们就得到了每一类的 坐标区间。在区间上,在对应类别的线段树里查询是否有非 位置即可。
最后是轮廓线端点的 set 维护。一个点在轮廓线上出现或消失的事件只能有常数个:它自己的长方体被平面 扫过的开始和结束是两个事件。它可能被别的轮廓线端点挡住,仅在挡住它的轮廓线端点消失时能露出来。所有挡住它的轮廓线都消失的 坐标的集合是一个区间(因为每个轮廓线端点消失的时间都是个区间,取这些区间的交),这个区间也只能生成 个事件。所以一个点在轮廓线上出现或消失的事件只能有常数个。我们只要把这些事件处理出来,到对应的时间在 set 中加入或删除对应端点即可。加入和删除的时候要更新 棵线段树。
- 1
信息
- ID
- 9330
- 时间
- 3000ms
- 内存
- 1024MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者