专题题解 - 积木游戏

$O(n\log n)$ 题解。

加入一个横坐标范围 $[x,y]$,高度为 $h$ 的矩形 $R$ 后形成的新的洞的轮廓上至少要有一条 $R$ 的边,事实上只有如下五种情况:

  1. 洞的轮廓只包含 $R$ 的下边;
  2. 洞的轮廓只包含 $R$ 的左边;
  3. 洞的轮廓只包含 $R$ 的右边;
  4. 洞的轮廓同时包含 $R$ 的左边和下边;
  5. 洞的轮廓同时包含 $R$ 的右边和下边。

这是因为轮廓显然不可能包含 $R$ 的上边(否则 $R$ 正上方还有别的矩形),也不可能同时包含 $R$ 的左边和右边(否则 $R$ 浮空)。

下面分别讨论这些情况。

  1. 洞的轮廓只包含 $R$ 的下边:

    其一般情况如下图,一个洞 ① 从上面被 $R$ 堵住,两边也各被堵住。

    我们求出 $R$ 的横坐标范围 $[x,y]$ 的区间最大值的同时,也求出有多少段由区间最大值组成的连续段,那么两个连续段之间的部分就是一个这样的洞,而连续段数量容易在线段树上顺便维护。

  2. 洞的轮廓只包含 $R$ 的左边(右边):

    其一般情况如下图,一个洞从右边被 $R$ 堵住,上下也各被堵住。

    我们称上下被堵住,左右有一边被堵住的结构叫做“半洞”,我们发现只要考虑横坐标 $x-1$ 处的半洞即可。

    具体地,用 set 维护每个横坐标处的半洞(这个洞在对应横坐标处的上下边界),加入 $R$ 后只会在 $x,y$ 处各增加至多一个半洞(即原本的上边界到 $R$ 的下边界之间的空洞),要查询包含 $R$ 左边(右边)的新洞时只需要在 $x-1$($y+1$)的 set 中找到 $R$ 这一段纵坐标上的半洞数量即可。

    (利用单调性,用 queue 或 vector 也可)

  3. 洞的轮廓同时包含 $R$ 的左边(右边)和下边:

    这只是边界情况,处理 2 中的半洞和 1 中的最大值连续段的时候进行一些特判即可。

时间复杂度为 $O(n\log n)$。