P17446 去心邻域 / Punctured Neighborhood
题目描述
**这是一道交互题**。
有一个未知序列 $B$,元素是 $0$ 或 $1$,下标从 $1$ 开始。你可以进行多次询问,每次询问指定中心 $m$ 以及半径 $r$,交互器将返回 $B$ 的下标去心邻域 $[m-r,m+r]\setminus\{m\}$ 内 $1$ 的个数。尝试确定 $B$ 中一共有多少个 $1$。
注意,你询问的区间不能超出序列本身的边界。
## **交互方式**
**本题有多组测试数据。**
首先读入一行,仅包含一个正整数,表示数据组数 $T (1\le T\le 1000)$。
对于每组数据:
- 首先读入一行,仅包含一个整数 $n$ ($4\le n\le 1000$),表示 $B$ 的长度。
- 发起询问时,需要以 `? m r` 的格式输出一行并**清空缓冲区**,要求 $2\le m\le n-1,r\ge 1,m-r\ge 1,m+r\le n$。然后读入一行,包含一个非负整数,表示 $\sum_{i=1}^r(B_{m-i}+B_{m+i})$ 的值。
- 当你确定答案后,以 `! x` 的格式输出一行并**清空缓冲区**,其中 $x$ 表示 $B$ 中 $1$ 的个数。
- 特别地,若无论如何询问都不可能确定答案,输出一行 `! -1` 并**清空缓冲区**。
**每组数据的询问次数不能超过 $35$**。
**任何不符合交互要求的输出,包括交互格式错误、超出交互次数限制等,都会导致未定义的运行结果**。
输入格式
无
输出格式
无
说明/提示
样例展示了一个可能的交互过程,两组数据中的未知序列分别为 `1100` 和 `11111`。
如何清空缓冲区:
- 在 C 和 C++ 中,使用 `fflush(stdout)`(如果使用 `printf`)或 `cout.flush()`(如果使用 `cout`);
- 在 Python 中,使用 `stdout.flush()`;
- 特别地,在 C++ 中,使用 `cout