Description
信用卡是一个矩形,唯四个角作了圆滑处理,使它们都是与矩形的两边相切的 $\frac{1}{4}$ 圆。现在平面上有 $n$ 张竖直方向长为 $a$,水平方向长为 $b$,圆半径为 $r$ 的信用卡,给定每张信用卡的坐标 $(x,y)$ 和旋转的弧度 $\theta$,试求其凸包的周长。注意凸包未必是多边形,因为它可能包含若干段圆弧。
$(1 \leq n \leq 10^4,0.1 \leq a,b \leq 10^6,0.0 \leq r < \min \{ \frac{a}{4},\frac{b}{4} \};|x|,|y| \leq 10^6, 0 \leq \theta < 2\pi)$
Source
Solution
包含所有信用卡的凸包一定由若干线段和圆弧构成。
我们可以把每张信用卡简化成一个矩形,矩形的四个顶点分别是其对应圆弧的圆心。
这个矩形上的每一个点到信用卡的轮廓距离刚好等于 $r$ 。于是问题就和 [Luogu]P2116 很相似了,唯一不同的地方在于点的处理(这里只分析该问题,其它过程详见链接)。
我们可以把这个矩形的四个顶点加入点集(比如说上图中的点 $A,B,C,D$)。具体求法为先假设信用卡中心为 $(0,0)$,得到的四个顶点分别为
然后对这些点进行旋转,最后给每个顶点的坐标加上原来的中心坐标即可。
对点集中的点求凸包长度,即是所有线段的总长。而圆弧总长刚好是半径为 $r$ 的圆的周长,加起来即是答案。时间复杂度为 $O(n \log n)$ 。
Code
1 |
|