这题也是找学长要的。
由于被单之间不相交但可能覆盖,并且小的一定在打的上面,我们可以把被单的覆盖关系看做一棵森林。
那么问题就等价于子树数颜色。
这个当然可以树上启发式合并,但是我写了启发式合并 set。
问题就在于转化的过程。
显然这种东西得上扫描线对吧。
我的思路独树一帜(
对于每个矩形的左边界,我们把线段树上对应的一段覆盖成这个矩形的编号。
但是在覆盖之前要看这个部分之前被哪个矩形覆盖了,这个前辈就是当前矩形在森林中的父亲。
对于每个矩形的右边界,我们不能简单地覆盖成全 −1。
可能在一个大矩形中存在多个矩形对齐,这时如果处理完其中第一个矩形再处理第二个矩形时找到的父亲就是 −1。
所以要在覆盖左边界时把对应的右边界即将覆盖的值改成覆盖前的值。
对于每个射击点,直接找它打在哪个矩形上(优先找上面的)。
然后在它对应的 set 上插入。
于是在森林上做 DFS,处理完一棵子树后就把其对应的 set 与其父亲启发式合并。
代码:
1 |
|