CF2074E.Empty Triangle
普及/提高-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
这是一道交互题。
粉色士兵们向你隐藏了 n 个(3≤n≤1500)固定点 (x1,y1),(x2,y2),…,(xn,yn),其坐标未给出。已知任意两点坐标不同,且任意三点不共线。
你可以向主持人(Frontman)询问三个不同的下标 i、j、k。随后,主持人会绘制由点 (xi,yi)、(xj,yj)、(xk,yk) 构成的三角形,并按以下规则回应:
- 若至少有一个隐藏点位于三角形内部,主持人会返回其中一个这样的点的下标。注意,若有多个这样的点,主持人可以任意选择其中一个返回。
- 否则,主持人返回 0。

你的目标是找到一个不包含其他隐藏点的三角形(如图中蓝色三角形所示)。你最多可以使用 75 次询问,找到由三个点构成的、内部不含其他隐藏点的任意三角形。
注意:主持人可能在选择返回的点时具有自适应性。换言之,返回点的选择可能受到多种因素影响(包括但不限于点的排列和之前的询问)。但需注意,点的序列永远不会被改变。
本题禁用 hack。你的解法将在恰好 35 个输入文件(包括示例输入)上进行评测。
输出格式
每个测试包含多个测试用例。第一行包含测试用例的数量 t(1≤t≤20)。接下来是每个测试用例的描述。
每个测试用例的第一行包含一个正整数 n —— 点的数量(3≤n≤1500)。
之后,你可以在单独一行输出以下内容进行询问:
- "? i j k"(1≤i,j,k≤n,i=j,i=k,j=k):询问由 (xi,yi)、(xj,yj)、(xk,yk) 构成的三角形。
随后,交互器会在新的一行返回一个整数:
- 若你的询问无效或询问次数超过 75 次,交互器返回 −1;
- 若存在下标 p(1≤p≤n)使得点 (xp,yp) 位于三角形内部,则返回任意一个这样的下标 p;
- 否则,交互器返回 0。
若你想提交答案,可以在单独一行输出以下内容:
- "! i j k"(1≤i,j,k≤n,i=j,i=k,j=k):表示由 (xi,yi)、(xj,yj)、(xk,yk) 构成的三角形内部不含其他隐藏点。
随后,以下交互会发生:
- 若答案无效或三角形包含其他隐藏点,交互器返回 −1;
- 若答案正确且仍有未处理的测试用例,你将获得下一个测试用例的 n 值;
- 否则,表示所有测试用例已正确解决,你的程序可正常终止。
注意:提交答案不计入询问次数。
注意:交互器可能在选择返回的点时具有自适应性。换言之,返回点的选择可能受到多种因素影响(包括但不限于点的排列和之前的询问)。但需注意,点的序列永远不会被改变。
每次输出询问后,请勿忘记换行并刷新∗输出缓冲区。否则,你将收到 Idleness limit exceeded 的判定结果。
若在交互过程中读取到 −1 而非有效数据,你的程序必须立即终止。这意味着你的程序将因无效询问或其他错误被判定为 Wrong answer。未能终止可能导致任意判定结果,因为程序会继续从已关闭的流中读取数据。
Hacks
本题禁用 hack。你的解法将在恰好 35 个输入文件(包括示例输入)上进行评测。
∗ 刷新缓冲区的方法:
- C++ 使用
fflush(stdout)或cout.flush(); - Python 使用
sys.stdout.flush(); - 其他语言请参考文档。
输入输出样例
输入#1
2 6 5 4 0 3
输出#1
? 1 2 3 ? 1 5 3 ? 2 5 6 ! 2 5 6 ! 1 2 3
说明/提示
第一个测试用例中的点为 (3,0),(0,3),(5,2),(3,1),(2,2),(4,4)。
三次询问对应的三角形如下:

可以看到,由 (0,3)、(2,2)、(4,4) 构成的三角形内部不含其他隐藏点,因此是一个有效答案。
注意:交互示例仅展示合法的交互流程,不一定是实际响应。例如,当查询 "? 1 2 3" 时,主持人可能返回 4。但由于主持人不会改变点的序列,因此不会对同一查询返回 6。
第二个测试用例中仅有 3 个点。因此,由这三点构成的唯一三角形内部不含其他隐藏点。
翻译由 DeepSeek R1 完成
输入解题思路,AI测评打分。不知道怎么写?