先注意几个点:
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),但无奈鄙人码力太弱,TLE了。
请各位看看这个做法是否可行,到底是我思路错了,还是玛丽弱了。