CF2061G.Kevin and Teams
省选/NOI-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
这是一道交互题。
Kevin 有 n 个同学,编号为 1,2,…,n。他们之间可能是朋友,也可能不是朋友。
Kevin 想要选出 2k 个同学组成 k 支队伍,每支队伍恰好包含 2 人。每个同学最多只能属于一支队伍。
设第 i 支队伍中的两人为 ui 和 vi。为了避免组队过程中潜在的冲突,队伍成员必须满足以下两个条件之一:
- 对于所有 i(1≤i≤k),同学 ui 和 vi 是朋友。
- 对于所有 i(1≤i≤k),同学 ui 和 vi 不是朋友。
Kevin 想要确定最大的 k,使得无论这 n 个人之间的朋友关系如何,他总能找到 2k 人组成队伍。之后,他需要组成这 k 支队伍。但询问两个同学是否是朋友很尴尬,因此 Kevin 希望在使用不超过 n 次询问的情况下达成目标。
交互器是自适应的。这意味着同学之间的隐藏关系在交互前并不固定,并且会在交互过程中改变。
输出格式
每个测试包含多个测试用例。第一行包含测试用例数量 t(1≤t≤104)。接下来是各个测试用例的描述。
每个测试用例的第一行包含一个正整数 n(2≤n≤105)—— 同学的数量。
首先,你需要输出一个整数 k(1≤k≤2n)—— 你能组成的最大队伍数量。
你可以通过以下方式进行查询:输出一行格式为 ? u v 的内容,其中 1≤u=v≤n。之后,读取一个整数:0 或 1,表示他们是否是朋友。1 表示是朋友,0 表示不是朋友。
如果你想要输出答案,请输出 ! u1 v1 u2 v2 … uk vk。你需要输出恰好 2k 个不同的数字。然后,交互将继续进行下一个测试用例。
你最多可以进行 n 次查询。输出答案不计入查询次数。
保证所有测试用例的 n 之和不超过 105。
每次输出查询后,请不要忘记换行并刷新输出∗。否则,你将得到 Idleness limit exceeded 结果。
如果在任何交互步骤中读取到 −1 而非有效数据,你的程序必须立即退出。这意味着你的程序将因无效查询或其他错误而收到 Wrong answer。未能退出可能导致任意结果,因为你的程序将继续从已关闭的流中读取。
Hack 方式
用于 Hack 的交互器不是自适应的。要创建 Hack,请使用以下格式。
第一行包含单词 "manual"。
第二行包含一个整数 t(1≤t≤104)—— 测试用例数量。
每个测试用例的第一行包含一个整数 n(2≤n≤105)—— 同学的数量。
每个测试用例的第二行包含一个由 '0' 和 '1' 组成的字符串 s,长度为 2n(n−1) —— 表示 (1,2)、(1,3)、…、(1,n)、(2,3)、(2,4)、…、(2,n)、…、(n−1,n) 之间的关系。'1' 表示是朋友,'0' 表示不是朋友。
以下是示例输入:
manual
2
3
011
5
1011101011
所有测试用例的 n 之和不得超过 105。
Hack 还有一个额外限制:所有测试用例的 2n(n−1) 之和不得超过 107。
∗ 要刷新输出,请使用:
- C++ 中的 fflush(stdout) 或 cout.flush();
- Python 中的 sys.stdout.flush();
- 其他语言请参考文档。
输入输出样例
输入#1
2 3 1 5 1 0 1 0 0
输出#1
1 ? 1 2 ! 1 2 2 ? 1 2 ? 3 4 ? 3 5 ? 1 3 ? 2 4 ! 1 2 3 5
说明/提示
第一个测试用例:
Kevin 声称无论 3 人之间的朋友关系如何,他总能组成 1 支队伍。
Kevin 询问同学 1 和 2 是否是朋友。裁判回答他们是朋友。
Kevin 回答他可以组成由同学 1 和 2 组成的队伍。
第二个测试用例:
Kevin 声称无论 5 人之间的朋友关系如何,他总能组成 2 支队伍。
Kevin 询问了同学 (1,2)、(3,4)、(3,5)、(1,3)、(2,4) 之间的关系。裁判依次回答 1,0,1,0,0。
Kevin 回答他可以组成两支队伍 (1,2) 和 (3,5)。
也可以组成两支队伍 (1,3) 和 (2,4),因为他们都彼此不是朋友。
翻译由 DeepSeek R1 完成
输入解题思路,AI测评打分。不知道怎么写?