QOJ.ac

QOJ

Limite de temps : 1.0 s Limite de mémoire : 256 MB Points totaux : 100

#14138. 红外线

Statistiques

你刚刚在你的橡皮鸭收藏中添加了一件皇冠明珠:一只皇家橡皮鸭。不幸的是,Akulyat 已经闻到了风声,正全速赶往你的保险库企图偷走它。

为了保护它,你将这只鸭子放在了保险库中最安全的房间里。这个房间的形状是一个拥有 $n$ 个顶点的凸多边形,因此有 $n$ 面墙。在顶点 1 处有一扇安全门。这扇门配备了红外激光系统,保护着墙 1(顶点 1 和 2 之间)和墙 $n$(顶点 $n$ 和 1 之间)。

然而,你担心未受保护的墙 2 到墙 $n - 1$。幸运的是,安全系统在顶点 1 处还安装了一个强大的激光发射器和接收器。你希望调整激光的方向,使得:

  • 它从顶点 1 出发,
  • 严格按照墙 2、墙 3、……、墙 $n - 1$ 的顺序依次反射,
  • 最后精准地返回到顶点 1。

所有反射都遵循理想光学定律(入射角等于反射角),且多边形是凸的。你需要确定是否可以按上述方式调整激光。如果可以,计算所需的发射角度。

基准方向(角度 $0^\circ$)为 $x$ 轴正方向,角度以逆时针方向的度数衡量。

重要提示:为了不破坏光学系统,你决定让所有反射点都严格位于其对应墙壁的内部:更具体地说,距离两个端点至少 $10^{-5}$ 个相对单位。形式化地,对于墙壁 $[a, b]$,合法的反射点 $p$ 具有 $p = \alpha a + (1 - \alpha)b$ 的形式,其中 $\min(\alpha, 1 - \alpha) \ge 10^{-5}$。

输入格式

每个测试点包含多个测试用例。第一行包含测试用例的数量 $t$($1 \le t \le 1000$)。接下来是测试用例的描述。

对于每个测试用例,第一行包含一个整数 $n$($3 \le n \le 20$):凸多边形的顶点数。

接下来的 $n$ 行,每行包含两个整数 $x_i$ 和 $y_i$($-10^9 \le x_i, y_i \le 10^9$):顶点的坐标。顶点按逆时针顺序给出,并构成一个严格凸多边形。

输出格式

对于每个测试用例,如果没有解,输出单行 "NO"。

否则输出两行。第一行必须包含 "YES"。第二行输出一个实数 $d$($-180 \le d \le 180$):激光射向墙 2 时,相对于 $x$ 轴正方向(逆时针)的角度(以度为单位)。

光线的轨迹应按要求的顺序击中所有墙壁内部的点,并结束于顶点 1 的 $10^{-7}$ 邻域内。顶点 1 的 $10^{-7}$ 邻域定义为墙 1 或墙 $n$ 上的任意点 $(x, y)$,满足 $(x_1 - x)^2 + (y_1 - y)^2 < (10^{-7} \cdot L)^2$,其中 $L$ 是多边形周长(各边总长度)。

如果有多个角度满足条件,输出任意一个合适的角度。

样例

输入样例 1

2
3
1 2
0 0
2 0
4
0 0
1 0
1 1
0 1

输出样例 1

YES
-90
NO

输入样例 2

3
4
0 0
4 0
5 4
-1 4
5
-809016994 -587785252
309016994 -951056516
1000000000 0
309016994 951056516
-809016994 587785252
6
-1000000000 0
-500000000 -866025404
500000000 -866025404
1000000000 0
500000000 866025404
-500000000 866025404

输出样例 2

YES
24.623564786163612980174342226292
YES
9.732301397707778775440778940009
NO

说明

题面中给出了第二个样例中第一个测试用例的示意图。

保证对于每个答案为 "YES" 的测试用例,都存在一个发射角度,其所有反射点 $p = \alpha a + (1 - \alpha)b$ 均满足 $\min(\alpha, 1 - \alpha) \ge 10^{-5} + 10^{-9}$。同时也保证对于每个答案为 "NO" 的测试用例,不存在“几乎合法”的发射角度:这意味着在某个点上,要么没有交点,要么满足 $\min(\alpha, 1 - \alpha) < 10^{-5} - 10^{-9}$。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.