一道水题,二分就做完了,就是有个情况有点坑。
题目大意
给定一圆内接多边形的边长 $a_1,\cdots,a_n$,求该圆半径。
$n\le 1000$,$a_i\in [1,6000]\cap \Z$。
source: ICPC Asia Regional Contest, Yokohama, 2021–03–17, Problem E
link: http://qoj.ac/contest/802/problem/2267
思路
二分 $r$ 即可。
考虑在半径为 $r$ 的圆上放置弦 $a_i$,设 $\theta_i$ 为 $a_i$ 对应的圆心角(限制在 $[-\pi,\pi]$),容易写出 $\theta_i=2\operatorname{asin}(\dfrac {a_i}{2r})$.
第一种情况:最大弦不为优弦。
显然若答案为 $r_0$,则 $\sum\limits_i\theta_i=2\pi$.
容易知道 $\dfrac{\mathrm {d}\theta_i}{\mathrm {d}r}=-\dfrac{2a_i}{r\sqrt{4r^2-a_i^2}}<0$,所以 $\dfrac{\mathrm{d}\sum\limits_i\theta_i}{\mathrm{d}r}<0$,直接二分。
第二种情况:最大弦为优弦。
令 $a_1=\max{a_i}$
显然若答案为 $r0$,则 $\theta_1-\sum\limits{i\ne 1}\theta_i=0$.
单调性感性理解:
如果将 $a_2,\cdots,a_n$ 相邻地放置在圆上,则总弧所对的弦一定随着 $r$ 的增大而增大。
——神仙 zz
具体证明不会。
代码
一定要搞清是单调递减还是递增!
1 |
|