#CF2049E. Broken Queries
Broken Queries
E. Broken Queries
每个测试用例时间限制: 秒 每个测试用例内存限制: 兆字节
你,一个造物被巨龙摧毁的法师,决心用魔法范围追踪器追捕它。但你似乎被戏弄了……
本题是交互题。
存在一个长度为 的隐藏二进制数组 ( 是 的幂),以及一个隐藏整数 ()。数组 中恰好有一个 ,其余元素均为 。 对于两个整数 和 (),定义区间和:
你有一个魔法装置,可以接收区间并返回区间和,但当区间长度大于等于 时,它会返回相反的结果。 形式化地说,每次查询你可以输入一对整数 (满足 ),装置会按照以下规则返回 或 :
- 若 ,返回 真实值 ;
- 若 ,返回 取反值 。
请你使用不超过 次查询,找出隐藏的整数 。
该装置非自适应:隐藏的数组 和整数 在交互开始前就已固定,不会在交互过程中改变。
交互格式
本题包含多组测试用例。
- 第一行输入测试用例数量 ()。
- 每组测试用例的格式:
- 第一行输入一个正整数 ()—— 隐藏数组的长度。保证 是 的幂,即存在非负整数 使得 。
查询方式
你可以按照以下格式发起查询:
输出一行 ? l r,其中 。
随后读取一个整数( 或 ),即装置的返回结果。
回答方式
当你确定答案后,输出一行 ! k。
输出答案不计入查询次数,之后程序继续处理下一组测试用例。
重要要求
每次输出查询/答案后,必须换行并刷新输出缓冲区,否则会出现超时错误。 如果在任意交互步骤中,你读到的结果是 (而非合法的 ),你的程序必须立即退出。这代表你的查询无效或出现了其他错误,若不退出会导致未知评测结果。
造数据格式(Hacks)
造数据格式如下:
- 第一行输入一个整数 ()。
- 每组测试用例仅一行,包含三个整数 :
- :隐藏数组长度(,且为 的幂);
- :数组中唯一 的位置();
- :隐藏的整数()。
刷新输出的方法
- C++:
fflush(stdout)或cout.flush() - Python:
sys.stdout.flush() - 其他语言请参考对应文档。
样例输入
2
8
0
0
1
0
4
1
0
样例输出
? 3 5
? 1 8
? 4 8
? 3 8
! 6
? 3 3
? 3 4
! 2
样例解释
-
第一组测试用例 ,隐藏数组中 的位置是 ,即 。
- 查询 :长度 ,装置返回正确结果。 不在区间内,结果为 ;
- 查询 :长度 ,装置返回取反结果,最终为 ;
- 查询 :长度 ,装置返回正确结果 ;
- 查询 :长度 ,装置返回取反结果 。 最终输出答案 ,正确。
-
第二组测试用例 ,隐藏数组中 的位置是 ,即 。
注:样例中的解法不一定能通过现有信息确定 ,仅作格式演示。