[HDU 4785] Exhausted Robot(闵可夫斯基和 + 扫描线)

扫地机器人最大清扫面积问题
该博客讨论了一个关于扫地机器人的问题,机器人需要在不与家具相交的情况下清扫房间的最大面积。问题转化为求解多个凸包并集的面积,采用闵可夫斯基和与扫描线算法进行求解,并通过并查集处理关键点的有效长度,以计算清扫区域的面积。博主指出代码实现较为繁琐,可能存在数据问题。

题意

给出一个房间(矩形)和 nnn 个家具(凸包) furnitureifurniture_ifurniturei,再给出一个扫地机器人(凸包)robotrobotrobot,机器人用它第一个点扫地,但扫地的时候不能和家具有交。机器人可以穿过家具,但穿过的时候不能扫地。问扫地能扫到的最大面积。
其中,n≤20n\le 20n20,每个凸包的点数 ≤20\le 2020,所有点的坐标绝对值不超过 300030003000

分析

设移动的向量为 α\alphaα,那么对于任意 iiiα∉{ furniturei−robot}\alpha\notin \{furniture_i-robot\}α/{ furnitureirobot}。其中,{ furniturei−robot}\{furniture_i-robot\}{ furnitureirobot} 指的是 furnitureifurniture_ifurniturei−robot-robotrobot 的闵可夫斯基和。
那么,最后 α\alphaα 构成的区域,就是一个矩形,剖去 nnn 个凸包后的区域,我们要求这个区域的面积。
我们补集转化一下,现在就是要求 nnn 个凸包并起来的面积,其中 n≤20n\le 20n20,每个凸包的点数 ≤20\le 2020
求解这个问题的思想叫做抠关键点思想。考虑所有的关键点,就是凸包的顶点和凸包和凸包的交点,还有凸包和矩形的交点。然后我们用扫描线扫描这些点,对于相邻的两条扫描线,假设左边那条的有效长度是 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))(rl)
而关键点的个数最多只有 20∗20∗20=800020*20*20=8000202020=8000 个左右,因此复杂度很低。
求解有效长度可以通过并查集来求。有一个值得注意的地方,就是只有当一个凸包横穿两条扫描线的时候,才统计它的贡献。
代码写起来很繁杂,最好写得系统一点。。。而且数据貌似有锅?总之这题写死我了。

代码如下

#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;

void debug_out(){
   
   
    cerr << endl;
}
template<typename Head, typename... Tail>
void debug_out(Head H, Tail... T){
   
   
    cerr << ' ' << H;
    debug_out(T...);
}
#ifdef local
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:"<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值