B. Line Segments
问题描述
在欧几里得平面上给定两个点 和 。
你从起点 开始,将执行 次操作。在第 次操作中,你必须选择任意一个点,使得你当前位置与该点之间的欧几里得距离*恰好为 ,然后移动到该点。
判断在执行完所有操作后,是否可能到达终点 。
*点 和 之间的欧几里得距离为 。
输入
每个测试包含多个测试用例。第一行包含测试用例的数量 。接下来是测试用例的描述。
每个测试用例的第一行包含一个整数 — 序列 的长度。
每个测试用例的第二行包含四个整数 — 起点和终点的坐标。
每个测试用例的第三行包含 个整数 — 每次操作要移动的距离。
保证所有测试用例的 的总和不超过 。
输出
对于每个测试用例,如果执行完所有操作后可能到达终点 ,则输出 “Yes”;否则,输出 “No”。
你可以以任何大小写形式输出答案。例如,字符串 “yEs”、“yes”、“Yes” 和 “YES” 都将被识别为肯定回答。
题解
对于每次移动,我们可以选择以当前位置为中心、半径为 的圆上的任意一点。此时,到目标点 的距离范围将变为 ,其中 是当前位置到 的距离。我们将这个范围重写为 。
- 我们从初始范围 开始,其中 ,而 是从 到 的距离。
- 对于每次移动 ,我们按如下方式更新范围:
- 如果 或 ,那么新的最小距离可以为0,所以 。
- 为下一次迭代更新 和 。
- 所有移动结束后,如果 在最终的范围 内,那么就有可能到达目标点。