示警 + 思路时间复杂度对,但是TLE了。
查看原帖
示警 + 思路时间复杂度对,但是TLE了。
1101254
Louisdlee楼主2024/10/10 01:22

先注意几个点:

1.矩形直接不会重叠!!

2.题给的是左下角和右上角,然后注意坐标系原点和 x,y 增长方向。

思路: 枚举每个矩形,对于每个矩形 i,检查它的四条边是否都“合法”(不与其他矩形接触)。

如何检查合法?以第 i 个矩形的顶边为例:

设第 i 个矩形的顶边位置是 up[i](其实就是右上角的 y 坐标),如果顶边要有接触,那么只能和底边位置为 up[i] 的矩形接触。

所以我们就对所有底边为 up[i] 的矩形进行检查。

设第i个矩形的左右边界是 l[i],r[i],设第 j 个底边位置为 up[i] 的矩形左右边界是 l[j],r[j] ,那么我们只需要检查线段 (l[i],r[i]) 是否与线段(l[j], r[j])相交即可。

这就是一个经典问题:给你一个线段 x,再给你一堆线段,让你判断这个线段 x 是否与线段堆中的任意一个线段相交。

如何加快检查过程?

可以用二分。

我们对底边位置是 up[i] 的矩形存一个 vector<pair>,代表左端和右端,然后按照右端排序,二分查找第一个大于 l[i]的右端值即可,这是常规的检查线段相交过程。

然后我们对每一条边都进行检查,总共需要四次二分。而一共只有 n 个矩形,所以时间复杂度应该是 O(nlogn)O(nlogn),但无奈鄙人码力太弱,TLE了。

请各位看看这个做法是否可行,到底是我思路错了,还是玛丽弱了。

2024/10/10 01:22
加载中...