题意
给出一个房间(矩形)和 n n n 个家具(凸包) f u r n i t u r e i furniture_i furniturei,再给出一个扫地机器人(凸包) r o b o t robot robot,机器人用它第一个点扫地,但扫地的时候不能和家具有交。机器人可以穿过家具,但穿过的时候不能扫地。问扫地能扫到的最大面积。
其中, n ≤ 20 n\le 20 n≤20,每个凸包的点数 ≤ 20 \le 20 ≤20,所有点的坐标绝对值不超过 3000 3000 3000。
分析
设移动的向量为 α \alpha α,那么对于任意 i i i, α ∉ { f u r n i t u r e i − r o b o t } \alpha\notin \{furniture_i-robot\} α∈/{
furniturei−robot}。其中, { f u r n i t u r e i − r o b o t } \{furniture_i-robot\} {
furniturei−robot} 指的是 f u r n i t u r e i furniture_i furniturei 和 − r o b o t -robot −robot 的闵可夫斯基和。
那么,最后 α \alpha α 构成的区域,就是一个矩形,剖去 n n n 个凸包后的区域,我们要求这个区域的面积。
我们补集转化一下,现在就是要求 n n n 个凸包并起来的面积,其中 n ≤ 20 n\le 20 n≤20,每个凸包的点数 ≤ 20 \le 20 ≤20。
求解这个问题的思想叫做抠关键点思想。考虑所有的关键点,就是凸包的顶点和凸包和凸包的交点,还有凸包和矩形的交点。然后我们用扫描线扫描这些点,对于相邻的两条扫描线,假设左边那条的有效长度是 f ( l ) f(l) f(l),右边那条的有效长度是 f ( r ) f(r) f(r)。那么这段区域的面积就是 ( f ( l ) + f ( r ) ) ( r − l ) 2 \frac{(f(l)+f(r))(r-l)}{2} 2(f(l)+f(r))(r−l)。
而关键点的个数最多只有 20 ∗ 20 ∗ 20 = 8000 20*20*20=8000 20∗20∗20=8000 个左右,因此复杂度很低。
求解有效长度可以通过并查集来求。有一个值得注意的地方,就是只有当一个凸包横穿两条扫描线的时候,才